通常、配列のサイズを増やすことはできないと思いました。しかし、次のようにするとどうなりますか:
char arr[4];
strncpy(arr,"12347777",8);
strlen(arr) を呼び出すと長さが増加することがわかります。誰かがそこで何が起こったのか説明できますか?
配列を大きくしていません。配列の末尾の後にメモリのランダムな断片を踏みつけました。
strlen
通常の状態であっても、配列の長さを返しません。文字列の長さを示します。そこに 8 文字 (および null ターミネータ) を配置しただけなので、8 が返されます。ただし、これは未定義の動作です。メモリが破損しているため、クラッシュしたり、乱数を返したりする可能性があります (標準によれば、何でも可能です)。実際、単純化されていないコードでは、これによりクラッシュが発生する可能性があります。
あなたは巨大なバグを作っただけです。メモリの破損やプログラムの誤動作につながる可能性があります。実際の配列サイズは変更されませんが、配列がある場所とそれに続くメモリが上書きされます。したがって{'1', '2', '3', '4'}
、配列に 4 文字を書き込みましたが{'7', '7', '7', '7'}
、次のメモリに書き込みました。幸運なことに、次のバイトがゼロになっているためstrlen(arr)
、サイズ 8 が表示されます。これは単純なバグであり、実行しないでください。注意"12347777"
はメモリへのポインターで{'1', '2', '3', '4', '7', '7', '7', '7', '\0'}
あり、8文字しかコピーしていないため、ゼロバイトの終了を逃しました。