2010-12-04 23 views
1

なぜこのコード構造体

1234567890asdfg 
asdfg 

の出力(iは文字列クラスを使用することはできません)

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

struct S 
{ 
char a[10]; 
char b[20]; 
}; 

int main() 
{ 
struct S* test = (S*)malloc(sizeof(S)); 

strcpy(test->a, "1234567890"); 
strcpy(test->b, "asdfg"); 

printf("%s\n%s", test->a, test->b); 

return 0; 
} 
+1

あなたの質問はCとタグ付けされましたが、実際にはC++コンパイラでこれをコンパイルしていますか?あなたは文字列クラスについて言及しています。構造体はCの 'S 'だけでなく' struct S'と呼ばれる必要があります。 – Cascabel

+0

MVC++を使用しています。それについての警告のためのThx。 – Husenica

答えて

6

test->aに入力した文字列は、ヌル終了文字(1234567890\0)を含めて11文字です。 aにコピーすると、ヌル文字はbの最初の文字になります。メモリ内にあなたが持っているように、あなたは、その後、bにコピー文字列で上書き:

a - - - - - - - - - b - - - - - - - - - - - - - - - - - - - 
1 2 3 4 5 6 7 8 9 0 a s d f g \0 
        ^
        | 
     a's terminating null was here. 

あなたはその後、a'1'から始まる)を印刷し、b'a'から開始)、その出力を生成します。

+0

良い答え。私の+1。 –

2

文字列"1234567890"が実際に11バイト(char S)が必要です。

bの最初の文字を上書きするようにしてください。