gpt4 book ai didi

c - c 中的指针算法和数组边界

转载 作者:太空狗 更新时间:2023-10-29 17:17:03 25 4
gpt4 key购买 nike

我正在浏览 webpage其中有一些常见问题解答,我发现了这个声明。

Similarly, if a has 10 elements and ip points to a[3], you can't compute or access ip + 10 or ip - 5. (There is one special case: you can, in this case, compute, but not access, a pointer to the nonexistent element just beyond the end of the array, which in this case is &a[10].

我被这个说法弄糊涂了

you can't compute ip + 10

我可以理解越界访问元素是未定义的,但是计算!!!。

我写了以下代码段,它计算(请告诉我这是否是该网站所说的计算)指针越界。

#include <stdio.h>                                                                                                                                                                  

int main()
{
int a[10], i;
int *p;

for (i = 0; i<10; i++)
a[i] = i;

p = &a[3];

printf("p = %p and p+10 = %p\n", p, p+10);
return 0;
}

$ ./a.out
p = 0xbfa53bbc and p+10 = 0xbfa53be4

我们可以看到 p + 10 指向 p 之后的 10 个元素(40 字节)。那么网页中的声明到底是什么意思。我是不是误解了什么。

即使在 K&R (A.7.7) 中,也有这样的声明:

The result of the + operator is the sum of the operands. A pointer to an object in an array and a value of any integral type may be added. ... The sum is a pointer of the same type as the original pointer, and points to another object in the same array, appropriately offset from the original object. Thus if P is a pointer to an object in an array, the expression P+1 is a pointer to the next object in the array. If the sum pointer points outside the bounds of the array, except at the first location beyond the high end, the result is undefined.

“未定义”是什么意思。这是否意味着总和将是未定义的,或者它仅意味着当我们取消引用它时行为是未定义的。即使我们不取消引用它而只是计算指向元素越界的指针,操作是否未定义。

最佳答案

未定义的行为意味着:绝对有可能发生。它可能默默地成功,也可能默默地失败,它可能使您的程序崩溃,它可能使您的操作系统蓝屏,或者它可能删除您的硬盘驱动器。其中一些不太可能,但所有这些都是允许的行为就 C 语言标准而言

在这种特殊情况下,是的,C 标准表示即使计算有效数组边界之外的指针的地址,而不取消引用它,也是未定义的行为。它之所以这样说是因为有一些神秘的系统,在这些系统中进行这样的计算可能会导致某种错误。例如,您可能在可寻址内存的最末端有一个数组,并且在该数组之外构造一个指针会导致特殊地址寄存器溢出,从而产生陷阱或错误。 C 标准希望允许这种行为,以便尽可能具有可移植性。

但实际上,您会发现在不取消引用的情况下构造这样一个无效地址在您经常遇到的绝大多数系统上都有明确定义的行为。创建无效的内存地址不会有不良影响,除非您尝试取消引用它。但当然,最好避免创建这些无效地址,这样您的代码即使在那些神秘的系统上也能完美运行。

关于c - c 中的指针算法和数组边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5341646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com