-3

コード:

char* data = NULL;
data = new char[lengthOfParam];   //lengthOfParam = 3
                               //after allocation **data = ¥¥¥¥Ü\r**
memcpy(data,&buffer[offset],lengthOfParam);   //**data = pki¥Ü\r**

なぜ私はそのジャンク値を取得していますか??? その値を他の配列に割り当てようとした場合、これらの余分な値bcsを回避または削除する方法例:

obj[1] = data;

次に、ジャンクの値全体がその変数に割り当てられます。

4

2 に答える 2

2

C の文字列は NUL で終了する必要があります。これは、文字列の末尾を示すために、文字列の末尾にゼロ値のバイトを追加する必要があることを意味します。配列の終わりを過ぎて読み取っている値をその後のメモリに表示/印刷するときに、文字列の終わりを示すものがないためです。

ソース データに NUL ターミネータが含まれている場合は、単純にもう 1 バイトを割り当ててコピーできますが、NUL ターミネータのない固定長フィールドであると仮定すると、手動で 1 つ追加する必要があります。

data = new char[lengthOfParam+1];

memcpy(data, &buffer[offset], lengthOfParam);
data[lengthOfParam] = 0;

また、投稿したこの行をさらに詳しく見てみましょう:

obj[1] = data;

私はここで間違っているかもしれません。間違っていたら申し訳ありませんが、この行はあなたが思っていることをしていないのではないかと強く思います。obj[1]これは、文字列からデータをコピーするのではなく、文字列へのポインタを格納します。したがって、 を削除するdataと、obj[1]も無効になります。

于 2012-07-25T13:35:41.993 に答える
1

これは C または C++ ですか?

を含む言語では、次のnewこともできます。

std::string data(&buffer[offset], lengthOfParam);

bufferはcharの配列であると仮定します。

于 2012-07-25T13:59:39.290 に答える