繁体   English   中英

关于指针和分段错误

[英]About pointers and segmentation fault

所以,我有这个代码:

#include <stdio.h>

int main()
{
    char *p;
    int var = -1;
    int i;

    /* Printing all memory we can read */
    p = (char *)&var;
    /* No stopping condition. The OS will stop us */
    for (i = 0;; i++)
    {
        printf("(%i) %i\n", i, p[i]);
        /*
         * The next statement also tries to write a zero
         * starting from &var. Try to uncomment and explain ...
         */
        //p[i] = 0;
    }
}

通过这种方式,它会按照预期的方式进入分段错误,输出:

..................
(6556) 108
(6557) 116
..................
(6582) 0
(6583) 0
Segmentation fault

取消对上面这行代码的注释: p[i] = 0;

它不会进入分段错误,输出是这样的:

..........
(1) 0
(2) 0
(3) 0
(4) 4
(1) 0
(2) 0
(3) 0
(4) 4
(1) 0
(2) 0
(3) 0
(4) 4
(1) 0
^C
i have to interrupt it

不明白为什么会这样,看起来我没有增加

通过这种方式,它会进入分段错误,因为它应该是

不“应该”做任何特别的事情。 i >= sizeof(int)未定义行为时,您p[i]所做的事情,任何事情都可能发生。

取消注释上面的这行代码: p[i] = 0; 它不会进入分段错误

它仍然是未定义的行为。 它不会以分段错误告终这一事实并没有多大意义。 我只能猜测p[i] = 0在某些时候最终会用0覆盖i的值,因此您最终会陷入无限循环。

不明白为什么会这样

试图理解未定义的行为没有多大意义。 没有合理的解释可以给出,只能猜测。


如果您想讨论给定您的程序的特定编译器生成的程序集,那么确保我们可以讨论它并告诉您事情发生的确切原因,但是鉴于您的 C 源代码,任何事情都可能发生 未定义的行为是未定义的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM