此代码在运行时会导致段错误。这是由于奇数指针增量所致,但我不明白为什么这是一个问题,因为它似乎有道理。
我认为应该:增加指针,然后取消引用未增加的指针,然后将值从 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);
}
}
最佳答案
while
循环永远不会终止:
第一次迭代:
*p = 10, out = 11
下一次迭代:
*p = 20, out = 21
下一次迭代:
*p = 30, out = 31
下一次迭代:
*p = 0, out = 1
下一次迭代:
您正在访问未经授权的内存,这会导致未定义的行为。
更新
访问数组中的最后一项后,包含代码的堆栈帧部分将被增量运算符践踏。因此,不能期望代码以合乎逻辑的方式运行。
关于c - 指针增量导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531427/