include<stdio.h>
int main()
{
//char b[10];
char *a="goodone";
//a=b;
scanf("%s",a);//this scanf fails and thow segmentation fault.
printf("%s",a);
}
为什么这不起作用?我用这个scanf试了很多但是,当我为我的变量保留内存a *(通过指定a = b(注释))它工作正常。否则它没有。 我相信char * a会为其字符串(“goodone”)分配一些内存,并将该内存位置返回其值。和printf一起工作正常,为什么scanf没有? 请救我脱离这个......
答案 0 :(得分:2)
这是因为您指示scanf
将其读取的数据写入为const char*
值分配的内存中,即写入只读内存。
如果您想使字符串保持可写,请更改
char *a="goodone";
到
char a[]="goodone";
请注意,这也不安全:当用户输入超过七个字符时,它可能会崩溃。为格式说明符添加限制以解决该问题:
scanf("%7s",a);
P.S。注释掉的a=b
工作正常,因为它没有修改字符串常量;相反,它将指针修改为字符常量, 允许。
答案 1 :(得分:1)
char *a
只是指向char
的指针。当您为其分配"goodone"
时,它指向该字符串文字(只读),而scanf
会尝试覆盖内存中导致崩溃的字符串。
如果为其分配b
,则a
指向可写内存区域10 char
s(即最大长度为9的字符串+终止NUL) 。所以只要scanf
没有存储比那里更长的东西,它就会起作用。
同样,您可以使a
成为数组而不是指针(即char a[] = "goodone";
)。再次,你需要注意不要在那里存放更长的东西。