NULL
ポインターに書き込むことはできません。
2 番目のケースでは、ポインタがプログラムのメモリ内の有効な場所にランダムに初期化されました。それがあなたがそれに入ることができる理由ですstrcpy
。
両方のプログラムを次のように変更します
str = malloc(size)
calloc
または の前にあるオプションstrcpy
。(size
は予約するスペースのサイズです。)
コメントに従って、str
to be char str[6]
(または more) の宣言を変更することもできます。
最終編集: プログラムのメモリとポインターを示すこの写真を紹介します。
灰色の領域と赤色の領域は禁止されています (書き込みや読み取りはできません。上の灰色の領域はカーネル メモリ用で、その他はまだ再利用されていない領域です)。一番下の赤い部分がスペシャル0ページです。あなたNULL
はこれを指しているので、あなたのプログラムは失敗します。0
str = NULL
何も割り当てないと、str
ランダムにポイントすることになります。まだ赤い領域または灰色の領域を指している可能性があります->プログラムは失敗します。緑または青 (両方の色合い) の領域を指すことができ、プログラムが機能します (読み取り専用の場所を指していて、そこに書き込む場合を除く)。ポインターに領域を割り当てると、緑色の領域を指すようになり、上部に拡大されます。
もう 1 つのオプションはstr[6]
、スタック領域を下に拡大します。すべてのローカル変数はスタックに予約されたスペースを持ち、 、 、およびその他の仲間で割り当てられたすべてのスペースmalloc
はrealloc
ヒープcalloc
に入ります。
最後に、 との違いに関するブログ記事をご覧ください。char[]
char *
PS: GNU 拡張機能を使用したい場合は、asprintf
関数を調べることができます。文字列にスペースを割り当て、そこにコンテンツを書き込みます。
asprintf(&str, "swami");
また
asprintf(&str, "%d + %d == %d\n", 1, 2, 3);
ただし、移植性が必要な場合は、この機能を使用しないでください。