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

その行がセグメンテーション違反を引き起こすのはなぜですか。値ではなくアドレス%sが必要だからです。printf実際の理由は何ですか?

4

1 に答える 1

3

str[2]charへのポインタではなく、charを返します。だから、printfアドレスで読み始めようとします0x6c。そこには0x6c、セグメンテーション違反の原因となる無効なアドレスである可能性があります。ただし、無効でない場合は、文字printfに到達するまで読み取りを続けます0x00。文字に達すると、無効なアドレス範囲に入る可能性があります。

なぜそれがsegfaultされるのかを正確に知りたい場合は、デバッガーをたどる必要があります。これは興味深く、教育的かもしれません。

クラッシュラインを修正したい場合は、次のように変更できます。

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

これは、よりも優れたスタイルだと思いstr+2ます。

于 2012-12-02T05:17:47.137 に答える