1

長さがループの反復に等しい動的な文字配列が必要です。

char* output;
for (short i=0; i<2; i++){
    output = new char[i+1];
    printf("string length: %d\n",strlen(output));
    delete[] output;
}

しかしstrlen、16を返しています.1と2であると予想されます.

4

3 に答える 3

7

が指す新しく割り当てられたメモリoutputは初期化されません。内容が含まれている可能性があります。

strlen引数がnullで終了する文字列へのポインタである必要がありますが、output初期化されていないため、そうではありません。この呼び出しstrlen(output)により、プログラムはこの初期化されていないメモリを読み取るため、未定義の動作を示します。任意の結果が可能です。

于 2012-08-13T21:28:06.723 に答える
0

strlenは、文字列の最後にNULLが見つかることを期待しています。0が見つかるまで、すべての文字をカウントします。文字を0に初期化するに
は、行を変更する必要があります。output = new char[i+1]();

于 2012-08-13T21:28:08.850 に答える
0

Cでは、文字列はnullで終了します。strlen()そのヌル終了が見つかるまでカウントされたバイトを返します。

new演算子は、メモリブロックのバイトが_zero_edになることを保証しません。

を使用することができますcalloc()。これは、割り当てるブロックのすべてのバイトをゼロにするかmemset(output, 0, i+1)、演算子で割り当てた後に行う必要がありますnew

于 2012-08-13T21:40:10.940 に答える