1

通常、配列のサイズを増やすことはできないと思いました。しかし、次のようにするとどうなりますか:

char arr[4];

strncpy(arr,"12347777",8);

strlen(arr) を呼び出すと長さが増加することがわかります。誰かがそこで何が起こったのか説明できますか?

4

2 に答える 2

3

配列を大きくしていません。配列の末尾の後にメモリのランダムな断片を踏みつけました。

strlen通常の状態であっても、配列の長さを返しません。文字列の長さを示します。そこに 8 文字 (および null ターミネータ) を配置しただけなので、8 が返されます。ただし、これは未定義の動作です。メモリが破損しているため、クラッシュしたり、乱数を返したりする可能性があります (標準によれば、何でも可能です)。実際、単純化されていないコードでは、これによりクラッシュが発生する可能性があります。

于 2014-02-25T07:42:09.340 に答える
0

あなたは巨大なバグを作っただけです。メモリの破損やプログラムの誤動作につながる可能性があります。実際の配列サイズは変更されませんが、配列がある場所とそれに続くメモリが上書きされます。したがって{'1', '2', '3', '4'}、配列に 4 文字を書き込みましたが{'7', '7', '7', '7'}、次のメモリに書き込みました。幸運なことに、次のバイトがゼロになっているためstrlen(arr)、サイズ 8 が表示されます。これは単純なバグであり、実行しないでください。注意"12347777"はメモリへのポインターで{'1', '2', '3', '4', '7', '7', '7', '7', '\0'}あり、8文字しかコピーしていないため、ゼロバイトの終了を逃しました。

于 2014-02-25T07:42:52.640 に答える