私はほとんど違いについて頭を悩ませていると思いますが、私が正しければ、これも正しいはずです:
1.)
char *string1 = (char*) malloc(runtime_determined_number);
2.)
char string2val[runtime_determined_number];
char *string2 = &string2val;
ここで、string1 と string2 が同じであることを期待しますが、そうですか?
string1
string2
同じメモリ領域を指していない
string1
char
で動的に割り当てられた配列を指すポインタですmalloc
string2
char
静的に割り当てられた配列を指すポインタです
それらは同じタイプを持ち、少なくともruntime_determined_number
バイトが割り当てられているという点で似ています。
それらは次の点で異なります。
free()
、メモリ リークを回避するために明示的に指定する必要があります。2 番目のバージョンは可変長配列を使用するため、C99でのみ有効であることに注意してください。
どちらも、同じ長さの初期化されていないメモリ ブロックを指しています。その点では同じです、はい。
free
ケース 1 の場合、作業が終了したらメモリを ing する責任があることに注意してください。ケース 2 では、終了時にメモリがスコープ外になるため、関数からポインターを安全に返すことはできません。
使用malloc
すると、実行時に OS にメモリが要求されます。malloc
成功した場合は、割り当てられたメモリで作業できます。後でこのメモリの割り当てを解除する必要があります。
2 番目の部分では、char
-array を作成し、そのアドレスをポインターに割り当てます。この場合、メモリは から取得され、配列が範囲外にstack
なるとfree
自動的に削除されます。
あなたchar*
の s は、メモリ内の異なる場所を指しているため、同じではありません。初期化していないため、同じゴミが含まれている可能性はほとんどありません...