長さがループの反復に等しい動的な文字配列が必要です。
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であると予想されます.
長さがループの反復に等しい動的な文字配列が必要です。
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であると予想されます.
が指す新しく割り当てられたメモリoutput
は初期化されません。内容が含まれている可能性があります。
strlen
引数がnullで終了する文字列へのポインタである必要がありますが、output
初期化されていないため、そうではありません。この呼び出しstrlen(output)
により、プログラムはこの初期化されていないメモリを読み取るため、未定義の動作を示します。任意の結果が可能です。
strlenは、文字列の最後にNULLが見つかることを期待しています。0が見つかるまで、すべての文字をカウントします。文字を0に初期化するに
は、行を変更する必要があります。output = new char[i+1]();
Cでは、文字列はnullで終了します。strlen()
そのヌル終了が見つかるまでカウントされたバイトを返します。
new
演算子は、メモリブロックのバイトが_zero_edになることを保証しません。
を使用することができますcalloc()
。これは、割り当てるブロックのすべてのバイトをゼロにするかmemset(output, 0, i+1)
、演算子で割り当てた後に行う必要がありますnew
。