繁体   English   中英

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

[英]i can't understand why 'segmentation fault error occurred in c

我写了一些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的新手,请善待我。 谢谢。

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

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

在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 ) ;
}

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

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

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

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

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

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

"This is a string"是存储在只读存储器中的字符串内容 所以你不能再覆盖它了!

正如其他人所提到的那样,你试图对不可编辑的常量字符串进行更改......但是你可以让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)的组合..它的作用是将输入字符串作为参数..为堆内存中的字符串分配足够的大小,将字符串内容复制到内存并返回内存的地址..

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

希望它有所帮助..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM