这段代码发生了什么?为什么我被允许迭代到335?

时间:2014-11-07 05:17:58

标签: c arrays memory operating-system

#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)?请解释我,我是一个非专业人士。

由于

3 个答案:

答案 0 :(得分:4)

访问数组越界会导致未定义的行为。因此,访问array[5]可能已经创建了一个分段错误 - 它未定义。在你的情况下访问array[335]导致内存违规,只是随机的。在不同的机器上试用它可能会有不同的行为。

  

行为,例如在使用错误程序时可能出现的行为   构成或错误的数据,本国际标准   没有要求3。

答案 1 :(得分:1)

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

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上比在您的机器上更进一步。您还可以看到某些地址已包含其他值。这些存在是因为它们不属于您的程序,还有其他东西将它们放在那里。如果存储了大量代码,那么您的代码可能会执行它(并做坏事)。

答案 2 :(得分:0)

你不应该在界限范围内访问数组。

int array[] = {0, 1, 2, 3, 4};

    for( i = 0; i < (sizeof(array)/sizeof(int)); i++)
        printf("%p %d %d\n", &array[i],array[i],i);