此代码在运行时导致分段错误。这是由于奇数指针增量,但我不明白为什么这是一个问题,因为它似乎是有道理的。
我认为它应该:递增指针,然后取消引用未递增的指针,然后将值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);
}
}
答案 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
会导致未定义的行为。