c - 指针增量导致段错误

标签 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);
     }
 }          

最佳答案

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/

相关文章:

c - 分段故障 ? C

pointers - 是什么导致了 Go 中的这个段错误?

c++ - 内存分配问题

c - 如何在没有溢出的情况下用定点运算计算多项式?

C - 将结构设置为 null(赋值中的类型不兼容)

c - 在C程序中打印链表

将结构转换为成员类型的指针

c++ - 如何访问 std::shared_ptr 的内容?

c - WinApi,按钮不显示

c - 增加 int 指针值 - 不起作用