1

C++ で理解できない問題があります。メソッド呼び出しの結果として unsigned char* を取得しました。char* を反復してデータを表示するとすべて問題ありませんが、データを印刷するだけでは同じ値が表示されません。

ここに私のコードサンプルがあります:

unsigned char returning[32];
for(int i=0;i<32;i++){
    returning[i] = result[i];
    std::cout << returning[i];//return the good values
}
std::cout << "\n";
std::cout << returning << "\n";
//the first one are the good values, and then there are wrong

誰かが私にこの奇妙な振る舞いを説明できますか?

4

2 に答える 2

1

まず、returning配列内で、31番目のインデックスまで値を割り当てているだけです。これは間違っています。その最後のバイトはnullで終了する必要があります\0

std::cout << returning[i]このステートメントは、その特定のASCII値を読み取り、対応する文字を出力します。

std::cout << returningただし、このステートメントは、に達するまでバイトを読み取り続けます\0。あなたの場合、returning配列はNULL終了していません。したがって、このバッファオーバーフローが発生し、最初の32バイトの適切な文字が印刷されてから、他のいくつかの文字の印刷が開始されます(正式な文字も読み取れない場合があります)。それ以上のバイトに到達しない場合\0は、アプリケーションがクラッシュするときに、そのセグメントを超えようとします。

于 2012-06-21T18:36:24.343 に答える
1

tl;dr:

unsigned char returning[33];
returning[32] = '\0';

修繕。

説明:

最初のループは、「returning」のすべての値を出力します。2 番目のコードは、値がゼロになるまで値のみを返します。char配列のゼロは行末文字として解釈されるため、その後停止します。

あるいは、「戻り」にゼロがどこにもない場合、2 番目のコードは、ゼロに到達するまでランダムな値を書き込み続けます。

于 2012-06-21T17:33:25.560 に答える