0
#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;
}

为什么那条线会出现分段错误。是因为%sinprintf需要一个地址而不是一个值。真正的原因是什么??

4

1 回答 1

3

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

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

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

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

我认为这比str+2.

于 2012-12-02T05:17:47.137 回答