【问题标题】:Segmentation fault and run time error [duplicate]分段错误和运行时错误[重复]
【发布时间】:2011-09-02 06:14:53
【问题描述】:

可能重复:
Modifying value of char pointer in c produces segfault

这是一段代码……

void main()
{
    char *p="Hello";
    *p= 'h';                      // Segmentation fault .
}

我理解存在分段错误并且它也给我一个运行时错误的事实。但我想知道,为什么它是一个运行时错误?为什么编译器在执行程序之前不能告诉我?为什么不显示编译时间错误?

PS : 我使用 Visual C++ 2005 Express ..

【问题讨论】:

  • 之前被问过很多次,例如stackoverflow.com/questions/5189782/…
  • 您是否启用了编译器警告?我不了解 Visual C++,但 GCC(具有默认警告级别)肯定会针对从字符串常量到 char * 的转换发出警告。它还正确地给出了一个错误,因为它没有从 main 中返回 int
  • @ Mike .. 我不确定.. 问题是我使用 Turbo C 来学习 C ..(请不​​要笑 :D).. 并且是 Visual C++ 编译器的新手.. 我不知道如何启用编译器警告,我也认为默认情况下它被设置为'禁用'..因为即使我没有从 int main() '返回',我也没有收到警告。
  • @Appy:在 C++ 中,不需要从 main 返回;如果您的代码从底部掉下来,编译器会自动有效地插入return 0;。但它的返回类型仍必须为int
  • @ Chris .. 感谢您的回复.. :) 我也发现这很有用.. 我希望你的意思是传达这个.. stackoverflow.com/questions/204476/… 但我的程序也运行 void main() 。 . ?!!

标签: c++ compiler-errors segmentation-fault


【解决方案1】:

字符串字面量实际上是char const* 类型。但是,为了与不正确的旧 C 代码兼容,C++ 允许将它们分配给 char*。这并不意味着您真的可以修改它们。

【讨论】:

  • +1 它们是只读的。不过,使用char p[] = "Hello"; 就可以了。
  • 感谢您的回答。但我仍然有一个问题。 “与不正确的旧 C 代码的兼容性”是什么意思? :?我试图理解它,但不清楚。在寻找它的含义时,我遇到了一个准确解释它的链接.. !! possibility.com/Cpp/const.html
  • @Appy:C++ 引入了 const 和 const-correctness 的概念;在 C++ 之前,不存在 const 的概念。严格来说,对于 const 正确的代码,您永远不能将字符串文字分配给 char*。但是,由于很多人将代码从 C 迁移到 C++,因此必须做出一些让步以使迁移更顺畅。这是一种这样的让步。
  • "这似乎是语言标准中的一个不一致之处。存在很多不一致之处是因为如果标准严格一致,旧的 C 和 C++ 代码就会损坏。人们害怕打破旧代码的标准,因为这将意味着该语言的流行度下降。”希望这是它不显示为编译器错误的原因,你能想到它如何使语言不那么受欢迎..奇怪吗? :?
  • @Chris .... 是的...我明白了你的意思.. 谢谢你的战利品.. :)
【解决方案2】:

您的错误无法在编译时表现出来;在那里,你的两个陈述都是完全有效的。它在运行时字符串"Hello" 是只读的并且您正在尝试修改它。

【讨论】:

    【解决方案3】:
    char *p="Hello";
    

    表达式类型被视为已弃用"Hello" 是存储在只读内存区域中的字符串文字;尝试修改这些位置是一种未定义行为。在好的平台上,它会导致崩溃/分段错误

    它们表示为,

    const char *p = "Hello";
    

    表示不允许修改p。如果您想让p 可修改,则将其声明为,

    char p[] = "Hello";  // 'p' is an array of size 6
    

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多