2016-12-12 10 views
0

私は初心者であるCを勉強しています。 事前に感謝します。'%s'を使ってポインタをcharへ逆参照すると、プログラムがクラッシュするのはなぜですか?

#include<stdio.h> 

int main() 
{ 
    char s[10]; 
    s[0]='A'; 
    s[1]='B'; 
    s[2]='\0'; 
    char *p; 
    int i; 

    p=s; 


    printf("%c\n", *p); //It's ok. 


    printf("%s", *p); // or *s...what's wrong here,why does program crash? 

    return 0; 
} 
+2

ポインタを期待しており、参照されていない値ではないためです。 –

+1

'%s'は' char'ではなく 'char'を想定しています。 –

+0

すべてのコンパイラの警告をオンにします。良いコンパイラは 'char * p; ... printf( "%s"、* p); '。 – chux

答えて

4

変更

printf("%s", *p); 

printf("%s", p); 

%sがポインタを期待している、と*pp[0]でchar値別名pで間接参照された値であることを理由

へ。

これが意味をなさない場合は、なぜprintf("%c\n", *p)が動作するのかを示します。 *pp[0]と同じで、s[0]と同じです.psを指しているためです。 s[0]charであるため、charを期待しているため、%cがここで動作します。一方、%schar *と予想されます。

+0

ありがとう、私は今理解しています。 '%s'はchar *を期待しています! –

+0

@すもん問題ありません。あなたが答えを見つけたら、アップフォートするか、答えを忘れないでください。幸運コーディング! –

+0

これは私の最初の質問です。そしてすぐに解決されました。かっこいいね! :) –

0

あなたはprintf("%s", p)が必要です。ポインタを逆参照しないでください。

関連する問題