我有以下程序进入segfault。我无法理解为什么。请帮助我。
int main(){
char *a="String One", *b="String Two";
while(*a++=*b++);
return 0;
}
为了分析它,我删除了while循环并使其更简单。它仍然给出了段错误!
int main(){
char *a="String One", *b="String Two";
*a++=*b++;
return 0;
}
但这很有效。我的意思是没有段错误!
int main(){
char *a="String One", *b="String Two";
*a++;
*b++;
return 0;
}
回复Luchien:
我实际上是想模仿strcpy。像这样的东西。现在我知道字符串文字是只读的,我可以让它工作。谢谢大家。
main(){
char x[10];
char *xx = x;
char *y = "Hello";
char *t=x, *f=y;
while(*xx++ = *y++);
printf(" %s ...%s \n",t,f);
}
答案 0 :(得分:4)
使用
char *a="String One", *b="String Two";
您的a
指向包含给定字符串的只读内存。修改它是未定义的行为。
答案 1 :(得分:3)
许多操作系统将文字字符串值存储在只读内存部分,这意味着修改内存的尝试导致操作系统告诉程序:嘿,你不能触摸它!在unix系统上,操作系统通过向进程发送SEGV信号来实现这一点,这通常会导致进程终止。
由于C程序在裸机嵌入式系统和许多不同的操作系统上运行,其中一些具有此限制,其中一些没有,C标准声明了此未定义的行为。
答案 2 :(得分:0)
您正在修改字符串文字,即未定义的行为。
我也觉得很烦人
char *a="String One"
实际上是
const char *a="String One"
"StringOne"
存储在只读存储器中,因此无法修改。
答案 3 :(得分:0)
当你通过说char *a="String One"
来创建一个字符串常量时,a'不是一个数组,而是一个初始化为指向字符串常量的指针。如果要更改它指向的字符串,可以将其指向其他位置,但尝试修改内容会导致未定义的行为。
答案 4 :(得分:0)
在第三段代码中,*a++
将访问a
指向的地址,该地址包含字符'S'
,因此没有段错误。
答案 5 :(得分:0)
while(*xx++ = *y++);
这真的是你想要的吗?你想完成什么?这实际上是未定义的行为,因为您不知道此后xx将是什么。你会先增加xx,还是首先将值从y复制到xx,然后递增?见http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 6.5.2
答案 6 :(得分:0)
a,b存储在数据部分中的那些字符串。该部分是只读区域。所以你无法在数据部分修改字符串。 a和b只是指向数据部分的点字符串的指针。 x存储在堆栈中,因此您可以对其进行修改。