ポインターに関するさまざまなチュートリアルを読みましたが、質問があります。
これは:
char *input = malloc(sizeof(char)*24);
と同じ
char *input[24];
私は、malloc がヒープ上に 24 スロットのスペースも作成するという印象を受けました。通常、char input[24] が表示されますが、char *input[24] は、malloc よりも簡単な方法であることがわかりました。
ありがとう!
いいえ、それらは同じではありません。
char *input = malloc(sizeof(char)*24);
ヒープ上に 24 文字のブロックを割り当て、そのブロックの先頭へのポインターを入力に割り当てます。(技術的には、x バイト数を割り当てるように指示しているだけです。ここで、x は各文字のサイズ (バイト単位) の 24 倍です)
char *input[24];
スタック上に 24 個の charポインターの配列を作成します。これらのポインターは、あなたが書いたように何も指しません (または init のガベージ)。
2 番目の例では、配列内の各ポインターを取得し、input
それが指すものをヒープ上に割り当てることができます。元:
char *input[NUM_STRS];
for( int i = 0; i < NUM_STRS; i++ )
{
input[i] = malloc( MAX_STR_LEN * sizeof(char) );
}
次に、スタックに文字ポインターの配列があります。これらのポインターはそれぞれ、ヒープ上の文字のブロックを指します。
ただし、関数が終了し、その変数がスコープ外になると、スタック上のものがポップオフされることに注意してください。何かを malloc すると、そのポインターは解放されるまで有効になりますが、スタック上に作成された配列には同じことが当てはまりません。
編集:あなたのコメントに基づいて、ヒープ上に24文字のポインターを作成し、それらが指すスペースを割り当てる例を次に示します:
#define NUM_STRS 24
#define MAX_STR_LEN 32
char **input = malloc( sizeof(char *) * NUM_STRS );
for( int i = 0; i < NUM_STRS; i++ )
{
input[i] = malloc( sizeof(char) * MAX_STR_LEN );
}
この例では、メモリ リークを避けるために、入力内の各ポインターを解放し、適切なタイミングでそれ自体を入力する必要があることに注意してください。
これらはまったく同じではありません。
char *input = malloc(sizeof(char)*24);
これにより、 24 を保持するのに十分なメモリが割り当てられchar
、アドレスがinput
(ポインター) に割り当てられます。このメモリは動的に割り当てられるため、 を適切に呼び出して、ある時点で解放する必要がありますfree()
。
char *input[24];
input
これは、24 個のポインターの配列であることを宣言します。これには自動ストレージがあります。つまり、それは必要ありませんfree
。free
(ただし、各ポインターが指しているものが必要になる場合がありますが、それは別の問題です!)
あなたはそれをよりよく比較することができますchar input[24];
(*に注意してください)。これで同じように使用できますinput
が、メモリはヒープではなくスタックにあります。