"分段错误" vs"运行时间"错误?

时间:2014-07-08 17:17:24

标签: c++ c memory segmentation-fault runtime

考虑这段片段:

  char *str = "hellow Ghost";
  str[0] = 'z';
  printf("%s", str);

这是一个分段错误。它是否也属于运行时内存错误?

我对分段错误的理解是:当您访问不属于您的内存时出现分段错误。它基本上是为您创建的实用程序,可以在不让您破坏内存的情况下轻松完成工作。

分段错误涵盖了多少和哪种内存错误以及调用它来检查指针或引用处理内存的错误。

由于逻辑不正确,也会发生运行时错误。除此之外,运行时错误和关于内存的分段错误之间是否存在任何差异。

4 个答案:

答案 0 :(得分:9)

  

这是一个分段错误。它是否也在运行时内存错误?

严格来说,它是一种未定义的行为。您可能会或可能不会出现分段错误。什么事情都可能发生。

声明

char *str = "hellow Ghost";  

相当于

char const *str = "hellow Ghost";  

字符串文字存储在只读部分,任何修改它的尝试都会调用UB。

C11:J.2未定义的行为:

  

在以下情况下,行为未定义:
  ...
   - 程序尝试修改字符串文字(6.4.5)。

答案 1 :(得分:7)

  

这是一个分段错误。它是否也属于运行时内存错误?

段错误在运行时始终是内存错误。

  

我对分段错误的理解是:当您访问不属于您的内存时出现分段错误。

没有

当您访问不属于您的内存时,可能会发生。这是问题的症状。但你不会承诺它会发生。

  

分段错误涵盖了多少和哪种内存错误以及调用它来检查指针或引用处理内存的错误。

这意味着您访问了尚未为您的流程保留的内存段。您的特定操作系统实现了此或者它没有。这不是必需的。

  

运行时错误与内存分段错误之间是否有任何差异。

如果发生段错误,则可以保证您有运行时内存错误。

如果发生运行时内存错误,则保证会出现段错误。

答案 2 :(得分:1)

段错误是几种可能的运行时错误之一;其他运行时错误可能包括除以零,域错误,范围错误,堆栈溢出等等。

“段错误”或“段错误”的确切含义可能因行为和环境而异;它可能意味着您正在尝试访问您不拥有的内存,或者您正在尝试执行不允许的操作(修改只读内存,这是您在此情况下尝试执行的操作),或者你试图取消引用无效的指针值(如NULL)或其他东西。

请注意,当您尝试修改字符串文字时,C语言并未强制要求引发段错误;它只表明行为是 undefined 。段错是几种可能性之一。另一种可能的结果是代码的行为与您预期的一样。

答案 3 :(得分:0)

修改字符串文字是未定义的行为。在大多数实现中,您将获得段错误。