[英]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的新手,请善待我。 谢谢。
s1
和sto
都是指向常量字符串的指针。
您尝试使用不同的字符串覆盖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.