【发布时间】:2014-05-08 01:54:08
【问题描述】:
此代码在运行时会导致分段错误。这是由于奇怪的指针增量,但我不明白为什么这是一个问题,因为它似乎有道理。
我认为它应该:增加指针,然后取消引用未增加的指针,然后将值 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);
}
}
【问题讨论】:
-
为什么你会假设 ++(*p++) 先增加数字然后增加指针?
-
我从来没有说过它确实如此......
-
好吧,您假设结果应该是 11、21、31、1 而不是 10、21、31、1。也可以改写问题。 “为什么你会假设数组内容的增量在非增量指针上增加?”
-
因为指针是递增的。首先,*p++ 递增指针并返回未递增的值。所以它返回 10。然后 ++(..) 将其增加到 11。
-
增量有效;代码同
for (int i = 0; myarray[i] != -1; ++i) { printf("%d ", ++myarray[i]); }
标签: c pointers segmentation-fault pointer-arithmetic