0

そうですね、データを移動するメモリをいじっています。ここで困っています。私は何が間違っている可能性がありますか? null ターミネータを考慮しましたが、まだ期待どおりの結果が得られません。

char buff[34] = "I will not do anything like that.";
char * protocol = "abcdefghi";

char data[44];

memcpy(data, protocol, 10);
memcpy(data + 9, buff, 34);

cout << data << endl; //abcdefghiI will not do anything like that.
cout << strlen(data) << endl; // 42

char poin[10];
memcpy(poin, data, 10);

cout << poin << endl; //abcdefghiI╠╠╠╠╠╠╠╠╠╠abcdefghiI will not do anything like that.

最後の cout については、abcdefghi だけを期待していましたが、上記のようになります。どんな助けでも大歓迎です、ありがとう!

4

3 に答える 3

1

poinnull で終了していないためです。の最初の 10 バイトを にコピーしたdataのでpoin、今

poin[0] == 'a'
poin[1] == 'b'
poin[2] == 'c'
poin[3] == 'd'
poin[4] == 'e'
poin[5] == 'f'
poin[6] == 'g'
poin[7] == 'h'
poin[8] == 'i'
poin[9] == 'I'

次に、std::cout配列poinの境界の外に出ましたが、それらのアドレスの値は実際には不明です。

于 2013-01-21T12:12:50.763 に答える
1

poin'\0'- で終わる文字列ではありません。'\0'ここで最初のものを上書きし'I'ました:

memcpy(data + 9, buff, 34);
于 2013-01-21T12:10:49.067 に答える
0

最後には、 C スタイルの文字列を終了するために使用されるmemcpyは含まれません。'\0'

strcpyを使用するか、C++ - を使用する場合は、はるかに優れていますstd::string

于 2013-01-21T12:11:12.617 に答える