printf中的%s格式说明符

时间:2012-12-02 05:09:04

标签: c segmentation-fault printf

#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需要地址而不是值。 究竟是什么原因?

1 个答案:

答案 0 :(得分:3)

str[2]返回一个char,而不是指向char的指针。因此,printf会尝试从地址0x6c开始阅读。在那里,0x6c很可能是一个无效的地址,会导致段错误。但是,如果它不是无效的,那么printf将继续阅读,直到达到0x00字符,这很可能会进入无效的地址范围。

如果你想确切地知道为什么会出现段错误,你需要在调试器中进行操作,这可能是有趣且有教育意义的。

如果您想修复崩溃线,可以将其更改为:

  printf("%s\n", &str[2]);

我认为它比str+2更好。