我无法理解为什么c中出现了分段错误错误

时间:2011-04-07 14:15:39

标签: c segmentation-fault

我写了一些C程序,如下所示。

 #include <stdio.h>
 #include <string.h>

 main() {
   char *s1 = "hello world!" ;
   char *sto = "it's original string" ;
   //copy
   strcpy( sto, s1 ) ;  

   printf( "%s", sto ) ;

 }

是的,有很多文章处理这个问题。我读了每篇文章。所以我发现没有初始化变量会导致错误。

但是,我认为这段代码没有错误,因为sto变量已经初始化为“它是~~ bla bla”的值。

我是关于c的新手,请善待我。谢谢。

8 个答案:

答案 0 :(得分:5)

s1sto都是指向常量字符串的指针。

您尝试使用不同的字符串覆盖sto指向的字符串,但这是一个常量,因此您尝试编写只读区域时会遇到段错误。

答案 1 :(得分:5)

在C中,你必须管理存储字符串的内存。

字符串文字,例如"This is a string"存储在只读存储器中。

您无法更改其内容。

但是,您可以编写如下内容:

main()
{
  char *s1 = "hello world!" ;

  // This will allocate 100 bytes on the stack. You can use it up until the function returns.
  char sto[100] = "it's original string" ;
  //copy
  strcpy( sto, s1 ) ;  

  printf( "%s", sto ) ;
}

答案 2 :(得分:3)

实际上,这个问题与C本身无关。您正在尝试覆盖字符串文字,但C99标准说这样做的结果是“未定义”(6.4.5第6点)。这意味着C实现可以自由选择做自己喜欢的事情。大多数实现只是尝试进行写入,而其他因素的组合会导致尝试失败。

原因程序赛格故障是因为你的编译器却偏偏把字符串中的可执行文件的文本段即可执行文件,所有的代码的部分文字。当操作系统将程序加载到内存中时,它将文本段标记为只读。然后,当strcpy()尝试写入字符串时,操作系统/处理器的内存保护会导致seg错误。

您可以在某些编译器中更改此行为。例如,gcc具有开关-fwritable-strings,它将使字符串文字加载到可写数据段中。我不推荐它。

答案 3 :(得分:0)

sto指向字符串文字。字符串文字是不可修改的字符数组。 strcpy尝试修改不可修改的元素: BANG!

答案 4 :(得分:0)

指针指向init-strings。但那些位于只读数据段中,因此它们不可写。

答案 5 :(得分:0)

这是因为分配给sto的内存大于分配给s1的内存。您必须声明一个新的char指针以创建sto。

的副本

答案 6 :(得分:0)

"This is a string"是一个字符串内容,存储在只读内存中。所以你不能再覆盖了!

答案 7 :(得分:0)

正如其他人所说,你试图对不可编辑的常量字符串进行更改......但是你可以让s1和sto指向其他地址....

要使代码正常工作,请进行一些更改。

#include <stdio.h>
#include <string.h>

main() {
    char *s1 = strdup("hello world!");
    char *sto = strdup("it's original string") ;
    //copy
    strcpy( sto, s1 ) ;  
    printf( "%s", sto ) ;

}

函数strdup是(malloc + strcpy)的组合..它的作用是将输入字符串作为参数..为堆内存中的字符串分配足够的大小,将字符串内容复制到内存并返回记忆地址..

所以现在你有两个动态分配的字符串,你可以自由地玩.. :) :)

希望它有所帮助......