#include <stdio.h>
int main()
{
char str[11] = "HelloWorld";
printf("%s\n",str);
printf("%s\n",str+3);
/* This Line here is the devil */
printf("%s\n",str[2]); // %s needs an addr not a value.
return 0;
}
为什么该行会出现分段错误。是因为%s
中的printf
需要地址而不是值。
究竟是什么原因?
答案 0 :(得分:3)
str[2]
返回一个char,而不是指向char的指针。因此,printf
会尝试从地址0x6c
开始阅读。在那里,0x6c
很可能是一个无效的地址,会导致段错误。但是,如果它不是无效的,那么printf
将继续阅读,直到达到0x00
字符,这很可能会进入无效的地址范围。
如果你想确切地知道为什么会出现段错误,你需要在调试器中进行操作,这可能是有趣且有教育意义的。
如果您想修复崩溃线,可以将其更改为:
printf("%s\n", &str[2]);
我认为它比str+2
更好。