为什么&x + 1不会导致seg错误?

tur*_*oup 3 c

这个线程中,它用于&x + 1确定一些随机struct x的大小.我想知道为什么这是一个合法的解决方案?这会导致分段错误吗?

我的理解是只要&x + 1保留在当前线程可访问的内存中,它就可以了,但是如果&x + 1以某种方式尝试访问超出其允许范围的内存,则会导致seg错误,是吗?

ASh*_*lly 6

第三,C标准明确允许指针指向一个超过数组末尾的指针.

...如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不会产生溢出...

正如@alk指出的那样,在进行指针运算时,指向对象的指针被视为长度为1的数组.

出于这些运算符的目的,指向不是数组元素的对象的指针与指向长度为1的数组的第一个元素的指针的行为相同,其中对象的类型为其元素类型.

(从第6.5.6.8和C99草案6.5.6.7 这里)

  • @ user763305:C99 6.5.6/7:"*出于这些[添加]运算符的目的,指向不是数组元素的对象的指针与指向长度数组的第一个元素的指针的行为相同一.*" (6认同)

Joh*_*åde 5

首先,在C中,所有线程都可以访问任何线程都可访问的所有内存.线程在这里不是问题.

其次,您永远不会取消引用指针&x + 1,因此您无论如何都无法访问任何内存.

所以你的代码是正确的.

  • 关于为什么`&x + 1`没问题,这是不正确的."不访问任何内存"并不能避免出现问题.实际原因是C标准允许将指针递增到超出数组末尾的指针(包括单个对象,它被视为一个元素的数组).如果表达式为"&x + 2",程序可能会崩溃.Per C 2011(N1570)6.5.6 8:"如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为是不确定的." (2认同)