【问题标题】:What is happening with this code? Why am I allowed to iterate until 335?这段代码发生了什么?为什么允许我迭代到 335?
【发布时间】:2015-01-03 20:26:31
【问题描述】:
#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)?请解释一下,我是外行。

谢谢

【问题讨论】:

  • 您的 printf 语句中缺少右括号?
  • 你想在这里做什么?伙计....代码中有很多错误,请告诉我您真正想做什么?
  • 我认为我们丢失了一些代码.... printf 语句不完整
  • 这取决于你的硬件
  • 2 个词:未定义的行为。

标签: c arrays memory operating-system


【解决方案1】:

越界访问您的数组会导致未定义的行为。所以访问array[5] 可能已经产生了分段错误——它是未定义的。在您的情况下,访问 array[335] 会导致内存冲突,这只是随机的。在不同的机器上尝试,它的行为可能会有所不同。

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

【讨论】:

  • 有没有解释为什么这个程序在 335 次迭代后停止? (即使我重新编译多次)
  • 不,未定义的行为只是未定义的。您可以尝试重新启动计算机,更改编译器设置/优化或构建配置(调试/发布),您的编号 335 可能会更改。但不能保证是任何东西——唯一可以保证的是,它不会少于 5 个!
【解决方案2】:

您不应该越界访问数组。

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);

【讨论】:

    【解决方案3】:

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

    335 的具体数字可能与您的程序分配了多少内存有关。这将取决于许多因素,包括硬件和操作系统。举个例子,我在键盘上运行了你的代码,输出如下: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
    

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

    【讨论】:

    • 非常感谢@southrop!
    猜你喜欢
    • 2016-06-09
    • 2012-08-29
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2012-07-26
    • 2014-09-28
    相关资源
    最近更新 更多