私はmalloc()とさまざまな文字列関数とのやりとりをテストして、ポインタとメモリがC言語でどのように動作するかを学びましたが、以下のやり取りについて少し混乱します。mallocとstrcpyのやりとり
char *myString = malloc(5); // enough space for 5 characters (no '\0')
strcpy(myString, "Hello"); // shouldn't work since there isn't enough heap memory
printf(%s, %zd\n", myString, strlen(myString)); // also shouldn't work without '\0'
free(myString);
上記のすべてが正しく動作するように見えます。私はヌルターミネータが存在するかどうかを確認するためにprintf()を各文字に使用しようとしましたが、とにかに空白として印刷するには '\ 0'が表示されます。
私の混乱はである:
- 文字列リテラルは、常に暗黙のヌルターミネータを持つことになります。
- strcpyのはのmyStringにヌルターミネータをコピーする必要がありますが、十分に割り当てられたヒープメモリはありません のmyStringはターミネータを持っていない限り、
- のprintf/strlen関数が動作しないはず のmyStringは明らかにヌルターミネータを持っているので
、 それはどこにある?それはちょうどランダムなメモリ位置に置かれましたか?上記のコードは発生するのを待っているエラーですか?
バッファオーバーラン。 – jxh
私の後で繰り返します: "未定義の動作"は "未定義"を意味します。それは、「失敗することを保証する」、「警告を生成する」、またはその他の予測可能なことを意味するものではありません。それがうまくいくからといって、それは何も間違っているというわけではありません。 –
あなたのバッファオーバーランによって未定義の動作が呼び出されています。あなたは「すべての上記が適切に動作するように見える」ことだけが幸運になっています。本当に私は_un_luckyと言うべきです。なぜなら、このような問題が発生したときにあなたのプログラムがクラッシュして、修正することができるからです。そうでなければ、彼らは時代の中で最も無礼に現れます... – yano