2012-01-06 8 views
8

私は両方のコードで同じことをやっています。文字配列とポインタの違い

コード1:char *を使用し、mallocを使用してmainにスペースを割り当てました。

コード2では、同じ目的でcharアレイを使用しました。しかし、なぜ出力が異なるのですか?

コード1:

struct node2 
{ 
    int data; 
    char p[10]; 
}a,b; 

main() 
{ 
    a.data = 1; 

    strcpy(a.p,"stack"); 
    b = a; 
    printf("%d %s\n",b.data,b.p);  // output 1 stack 
    strcpy(b.p,"overflow"); 
    printf("%d %s\n",b.data,b.p);  // output 1 overflow 
    printf("%d %s\n",a.data,a.p);  // output 1 stack 
} 

コード2:第2の例では

struct node1 
{ 
    int data; 
    char *p; 
}a,b; 

main() 
{ 
    a.data = 1; 
    a.p = malloc(100); 
    strcpy(a.p,"stack"); 
    b = a; 
    printf("%d %s\n",b.data,b.p); //output 1 stack 
    strcpy(b.p,"overflow"); 
    printf("%d %s\n",b.data,b.p); // output 1 overflow 
    printf("%d %s\n",a.data,a.p); // output 1 overflow(why not same as previous one?) 
} 
+1

@birryree 'b.p'は' a.p'から浅くコピーされています。 – Chad

+0

@Chad - うん、私は 'b = a'行を見逃していたので、コメントを削除しました。 – birryree

+0

@Chad - この浅いコピーは何ですか? –

答えて

10

もしa.pchar*)はb.pに割り当てられていることを意味する、bからaを割り当てています。したがって、b.pが指すメモリを変更すると、a.pが指すメモリも変更されます.は両方ともメモリ内の同じ場所を指しているためです。

最初の例では、の2つの別々のアレイがあります。 b.pに配列a.pabにコピーし、各charの割り当て - メモリのこれらのブロックはstructの一部である、彼らは、メモリ内の特定の部分にポインタじゃありません。この場合のb.pへの変更は完全に無関係なのでa.pには影響しません。

3

文字ポインタと文字配列は同じものではありません。

アレイのノードがコピーされているため、内容が新しいノードにコピーされます。コピーしたノード(b)に新しい値(オーバーフロー)を入れると、そのコピーだけが上書きされます。

文字ポインタを持つノードがポインタの値をコピーしているため、両方のノードが同じメモリ位置を指しています。コピーしたノード(b)に新しい値(オーバーフロー)を入れると、両方のノードにポインタがあることがメモリに書き込まれます。

3

最初のコードでは、構造体に実際の文字配列(char[10])が含まれているため、構造体(b = a)をコピーすると配列もコピーされます。次に、一方を上書きしますが他方は上書きしません。

2番目のコードでは、構造体に文字へのポインタが含まれているため、構造体をコピーするとポインタはコピーされますが、データはコピーされません。両方とも同じデータを指しています。