【问题标题】:Why don't i get "Segmentation Fault"? [duplicate]为什么我没有收到“分段错误”? [复制]
【发布时间】:2012-10-24 15:33:08
【问题描述】:

可能重复:
Why don’t I get a segmentation fault when I write beyond the end of an array?

此代码编译并运行,没有任何错误。但是怎么做呢?

#include <stdio.h>

int main (void)
{
    int foo[2];

    foo[8] = 4; /* How could this happen? */

    printf("%d\n", foo[8]);

    return 0;
}

我正在 Arch Linux x86_64 上使用 GCC 4.7.2 进行编译。

gcc -Wall -o "main" "main.c"

【问题讨论】:

  • 你很幸运应用没有崩溃。
  • @alk:不,崩溃是最好的结果。真的。
  • 是的,你是对的。我不知何故使用了错误的措辞。 @EdS。
  • "为什么我没有收到分段错误?"很少(如果有的话)是一个有效的问题。

标签: c string


【解决方案1】:

因为未定义的行为并不意味着“您将收到段错误”,所以这将是已定义的行为。

假设您在调试模式下运行并且您的编译器正在填充您的堆栈/局部变量空间。您可能只是在写入堆栈空间的一些未使用部分。

在您的编译器感觉不正常并且现在您覆盖返回地址或设置对printf 的调用的代码时,在星期一构建一个发布版本,等等。哎呀。

只有一种可能的结果,但你明白了。

【讨论】:

  • 这是我第一次听到这样的说法。为此 +1。
【解决方案2】:

foo[8] 可以分配给您的程序(例如填充目的),属于您的操作系统。对于未定义的行为,任何事情都可能发生;你不走运,因为它有效。

【讨论】:

    【解决方案3】:

    试试

    foo[1000000]=42; 
    

    看看会发生什么。

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2012-02-20
      相关资源
      最近更新 更多