指针递增导致分段错误

时间:2014-05-08 01:54:09

标签: c pointers segmentation-fault pointer-arithmetic

此代码在运行时导致分段错误。这是由于奇数指针增量,但我不明白为什么这是一个问题,因为它似乎是有道理的。

我认为它应该:递增指针,然后取消引用未递增的指针,然后将值10递增到11.因此out = 11,并且数组中的第一个值现在为11.所以此循环应打印出11, 21,31,1,然后继续无限打印出数组外的值。这显然是不好的做法,但我们只是想看看为什么这个双指针增量无效。

我的代码:

int main() {
     int myarray[4] = {10,20,30,0};
     int *p = myarray;
     int out = 0;
     while (out = ++(*p++)) {
         printf("%d ", out);
     }
 }          

3 个答案:

答案 0 :(得分:2)

while循环永远不会终止:

第一次迭代:

*p = 10, out = 11

下一次迭代:

*p = 20, out = 21

下一次迭代:

*p = 30, out = 31

下一次迭代:

*p = 0, out = 1

下一次迭代:

您正在访问未经授权的内存,这会导致未定义的行为。

<强>更新

在访问数组的最后一项之后,包含代码的堆栈帧部分被增量运算符践踏。因此,不能期望代码以逻辑方式运行。

答案 1 :(得分:1)

下面:

while (out = ++(*p++))

preincrement(第一个“++”)返回递增的值。所以当你到达数组的末尾时,它返回1,其值为true,循环继续。

答案 2 :(得分:1)

p超出myarray的范围时,deference会导致未定义的行为。