【问题标题】:why char pointer not giving segmentation fault?为什么char指针不给出分段错误?
【发布时间】:2014-04-02 08:07:56
【问题描述】:

今天早上我对 C 的行为感到惊讶。(真的让我感到惊讶。)

如果我写这样的代码:

char *txt;
strncpy(txt,"hello",4);
printf("%s\n",txt);  

然后我知道它会给出分段错误,因为我没有为'txt'指针分配内存。好的....现在看到这段代码:

char *txt = (char *) calloc(0,sizeof(char ));
strncpy(txt,"hello",4);
printf("%s\n",txt);

我仍然为 'txt' 分配了 0 个字节,但我只是惊讶为什么它没有给出分段错误?,而不是给出分段错误,它给出了正确的答案“地狱”。

谁能解释一下 C 的这种行为?

【问题讨论】:

  • 尝试致电free(txt) 看看会发生什么...
  • 调用 free(txt) 时一切正常,我的意思是没有错误出现,它给出了正确的答案。 @pat

标签: c pointers


【解决方案1】:

C 标准从不保证段错误。通常只有“未定义的行为”:如果你做 X,任何事情都可以发生。有时,在某些操作系统上,您会遇到段错误。但也许你会“走运”,没有什么不好的事情发生。或者您损坏了一些稍后将使用的内存,导致您的程序无缘无故地崩溃。

在这种情况下,未定义的行为是由您写入尚未分配的内存引起的。也许有效,也许无效。

【讨论】:

    【解决方案2】:

    我猜操作系统实际上分配的字节数超过了请求的字节数并且您正在写入,或者操作系统返回了不会导致段错误的 some 指针.

    根据http://en.cppreference.com/w/cpp/memory/c/calloc

    如果 size 为零,则行为是实现定义的(可能会返回空指针,或者可能会返回一些可能不用于访问存储的非空指针)

    显然你应该依赖这个。

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2015-09-10
      • 1970-01-01
      相关资源
      最近更新 更多