为什么scanf看起来会改变char *的行为?

时间:2016-11-03 01:13:23

标签: c scanf

我发现以下代码,我很难理解为什么它的工作方式如下:

char* str = "HELLO";
printf("%s",&str[0]); //Returns Hello as expected
printf("%c",str[2]); //Returns L as aspected
scanf("%s",&str); //I enter aaaa
printf("%s\n",&str); /* If I want to access the word I have to do this way
&str[0] now gives a segmentation fault.*/
printf("%c\n",&str[1]); /*This gives a b???!!!. I haven't found any way to 
access individual character with *str.*/

我特别感兴趣的是为什么看起来无法访问单个字符,虽然在某种程度上它是有意义的,毕竟你应该声明一个指向char的指针,我想知道它怎么能以某种方式作为字符串工作。但我想知道为什么第一个作为预期的字符数组而不是第二个。

感谢。

1 个答案:

答案 0 :(得分:2)

scanf("%s",&str);调用未定义的行为:您要求scanf读取字符串并将其存储到str指针本身的位置,而不是它指向的位置,这是一个字符串也不应该修改的文字。