2012-05-02 8 views
0

私はC言語でchar型のポインタを印刷しようとしている、私は値を見ることができるよ、それはCポインタでクエリ

 char *ptr = "I am a string"; 

    printf("\n value [%s]\n",ptr); 
    printf("\n address [%d]\n",&ptr); 

以下のようにメモリアドレスですが、私は直接ポインタを印刷など以下、それはSegmentation fault

 char *ptr = "I am a string"; 

    printf("\n value [%s]\n",*ptr); 

としてエラーを示すのは、ここで間違っ

注意を何が起こっているのかを教えてください:私は[%dの]またはprintfの形式を変更した場合、[%i]は、それは印刷です。

+2

'printf(" \ n値[%s] \ n "、ptr);' –

+0

@Sukumar '* ptr'が何であるか知っていますか? '* ptr'の値と型は何ですか? –

+0

@Als Sukumarの2行目のコードを引用すると、問題の内容を理解するのに役立つとは思わない。 –

答えて

3

%sフォーマット指定子は、0で終わるchar配列へのポインタを想定しています。 printfに対応する引数が*ptrの場合、char、つまりa)未定義の動作であり、b)おそらく文字の値(昇格された文字はint)と、おそらくは任意の隣接バイトがポインタとして解釈されます。それに続いて、想定されたポインタはプログラムに割り当てられていないメモリにアクセスする可能性があります。

4

*ptrはcharポインタではなく、%sは(C文字列への)charポインタが必要です。 charをポインタとして扱うと、printfは無効なメモリアドレスにアクセスしようとし、セグメント化エラーが発生します。

+0

Yeap ... 0x00 - 0xffのメモリにアクセスしようとしています – MrJames

+0

@MrJamesは正確に0x0049をアドレスします。 –

1

"%s"の形式をprintfに渡すと、関数はcharの配列へのポインタを要求します。