2016-11-05 6 views
-1

文字列を構造体にコピーして1つの属性のみを出力すると、構造体の両方のメンバが出力されます。なぜこれが起こり、これを克服するのか?char構造体の配列メンバー - 値が両方のメンバーにコピーされる

typedef struct { 

    char a1[14]; 
    char a2[2]; 

} X; 


void main() { 

    X x; 

    strcpy(x.a1, "55555555555555"); 
    printf("A1 - %s\n\n", x.a1); 

    strcpy(x.a2, "D5"); 
    printf("A1 - %s\n\n", x.a1); 
    printf("A2 - %s\n\n", x.a2); 

} 

出力:

A1 - 55555555555555 

A1 - 55555555555555D5 

A2 - D5 

なぜD5は、ここではA1に追加したのですか?

答えて

2

配列が小さすぎる場合、N文字の文字列にはN文字+1が必要です。

それは厳密に未定義の動作ですが、観察された行動は、struct用のストレージを使用すると、2つのアレイによって構成される「大きな文字列」を印刷している連続ように割り当てられているという事実に起因する可能性があります。

しかし、あなたは、アレイ内のすべての可能な要素を使用し、それらに非'\0'の文字をコピーしているので、「大きな文字列は」'\0'ターミネータがないため、その仮定は、また間違っています。

あなたのプログラムの実際の結果は予測できないと考えられるべきであり、振る舞いとして観察されるものは実際にはの未定義の動作です。

+0

[OK]をして\0文字の末尾にスペースを与えてみてください、逐次そのすべてのメンバーのためにそれを試してみましたが、機能するようになりました...だから、構造体の割り当てメモリ?ヌルがないので、A1が読み込まれたときに出力が追加されましたか?私は正しい? – user691197

+0

@ user691197私はそれがなぜ出力されたのかを説明する答えを更新しました。しかし、それは未定義の行動であるため、厳密には説明できません。 –

+0

http://cboard.cprogramming.com/c-programming/89920-structs-sequential-memory.htmlが役立つかもしれない@ user691197 – Cherubim

1

注:文字列は単なる文字列ではなく、代わりにnul文字\0)で終了する文字列

ここにあなたが持っている:

char a1[14]; 
char a2[2]; 

を、あなたがそれらを初期化します

5555... 14 times 
D5 

ここでは、の文字列の最後をマークするために\0文字がないため、文字配列を印刷しようとするとの結果は未定義のとなります。

は、各文字列

char a1[15]; //extra space for the null terminating character 
char a2[3]; //similarly here 
関連する問題