2011-07-11 8 views
1

ポインタの配列がI として動作するかどうかをテストするコードを少し書いた。次に、私はこの有線の結果を得ました - 3番目のポインタの割り当ての後、ポインタの配列はすべて最後の文字列を指しています。誰でも何が起こったのか説明できますか?ありがとうございました。混乱した結果:Cでのポインタの配列

#include <string.h> 
#include <stdio.h> 

main() { 

    char *pstr[10]; 
    char p[10]; 
    char *s1 = "morning"; 
    char s2[10] = {'h','e','l','l','o'}; 
    char s3[10] = {'g','o','o','d'}; 
    int i = 0; 

    strcpy(p, s1); 
    pstr[0] = p; 
    printf("%s\n", pstr[0]); 

    strcpy(p, s2); 
    pstr[1] = p; 
    printf("%s\n", pstr[1]); 

    strcpy(p, s3); 
    pstr[2] = p; 
    printf("%s\n", pstr[2]); 

    for (i = 0; i < 3; i++) 
     printf("%s\n", pstr[i]); 
} 

プログラムからの出力は次のようになります。

morning 
hello 
good 
good 
good 
good 
+2

文字列をヌル終了することを確認してください。 –

+0

U-la-la。私は一度に1つ(!)のものを試してみることをお勧めします。それがうまくいくと、次に難しい例に移ります。私はこのコードを見てめまいになり、誰かがあなたのためにそれを訂正すれば、あなたはまだ理解するのが難しいかもしれません....ステップバイステップ。 – AudioDroid

+0

また、あなたのメインリターンintを作る –

答えて

1

シンプルな、あなたはpstr[i]=p;ビットpは静的バッファのアドレスで設定してください。

5

pstr[0],pstr[1]およびpstr[2]pに設定しました。 pに書き込まれた最後のものは、バイトシーケンス"good"です。だから最終的に、あなたは本質的にpを3回印刷しています。

2

基本点 - pで参照されるメモリの配列には、一度に1つの文字列しか含めることができません。

コードの最後のループは、配列pstrの各エントリを同じポインタpでシードしているので、各繰り返しで常に同じ値を出力します。

各繰り返しで異なる結果を表示する場合は、メモリの異なる領域にpstr[0],pstr[1]およびpstr[2]を指す必要があります。

1

pstr [0]、pstr [1]、およびpstr [2]はすべて同じ10文字の配列pを指します。各文字列をコピーすると、配列pの内容は変更されますが、アドレスは変更されません。したがって、最後の文字列をpにコピーした後、同じことを3回印刷するだけです。

3

pstrアレイ内の3つのポインタはすべて、同じメモリ位置(p)を指します。

そして、strcpyコールを使用してそのメモリロケーションの内容を数回変更するため、最後に配置されたものがすべて含まれます。

この場合、最後に"good"という文字列が配置されているため、pstr配列の3つのポインタが指し示すものがすべてループに繰り返し表示されます。

1

配列のすべてのエントリがpであるだけでなく、nullではない終了文字列がstrcpy'ngです。 strcpy()は、文字列をnullで終了する必要があります。そうしないと、予期しない結果を招くバッファオーバーランが発生します。