C指针,seg错误

时间:2012-03-06 07:33:13

标签: c pointers segmentation-fault

我有以下程序进入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);
}

7 个答案:

答案 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存储在堆栈中,因此您可以对其进行修改。