C语言 此代码发生了什么?为什么允许我迭代到 335


#include <stdlib.h>
#include <stdio.h>
int main(void){
    int array[] = {0, 1, 2, 3, 4};
    for(int i = 0; i < 1000000; i++)
        printf("%p %d %d", &array[i], array[i], i);
    return 0;
}

哪个输出:

0x7fff5b0b0ac0 0 0
....... blahblah
0x7fff5b0b0fe4 0 329
0x7fff5b0b0fe8 0 330
0x7fff5b0b0fec 0 331
0x7fff5b0b0ff0 0 332
0x7fff5b0b0ff4 0 333
0x7fff5b0b0ff8 0 334
0x7fff5b0b0ffc 0 335
Segmentation fault: 11

我尝试编译,它总是在 335 上停止,这里发生了什么?它是否链接到我的硬件?(Macbook Air "13(?请解释一下,我是一个外行人。

谢谢

界访问数组会导致未定义的行为。因此,访问array[5]可能已经会产生分段错误 - 它是未定义的。在您的情况下,访问array[335]会导致内存违规,这只是随机的。在其他计算机上尝试,它的行为可能会有所不同。

行为,例如在使用错误程序时可能出现的行为 构建或错误数据,本标准对此 不强加任何要求 3.

当代码尝试访问某些内存但无法访问时,会发生分段错误。这可能是因为内存保护。通常,操作系统将内置内存保护,以防止未经授权的程序访问敏感的内存位,植入恶意代码和/或以提升的权限执行所述恶意代码。

335 的具体数字可能与程序分配的内存量有关。这将因许多因素而异,包括硬件和操作系统。举个例子,我在Codepad上运行了你的代码,这是输出:Codepad

0xff9bc704 0 0
0xff9bc708 1 1
0xff9bc70c 2 2
0xff9bc710 3 3
0xff9bc714 4 4
0xff9bc718 -16121856 5
0xff9bc71c -6568128 6
0xff9bc720 -143041244 7
...
0xff9bdcf0 0 1403
0xff9bdcf4 0 1404
0xff9bdcf8 0 1405
0xff9bdcfc
Segmentation fault

如您所见,它在Codepad上比在您的机器上走得更远。您还可以看到某些地址已包含其他值。这些之所以存在,是因为它们不属于您的程序,其他东西将它们放在那里。如果一大块代码存储在那里,那么你的代码可能会去执行它(并做坏事(。

你不应该越界访问数组。

int array[] = {0, 1, 2, 3, 4};
    for( i = 0; i < (sizeof(array)/sizeof(int)); i++)
        printf("%p %d %dn", &array[i],array[i],i);

相关内容

最新更新