ポインターを使用します。
具体的には、アドレスへのポインターを使用し、標準の C ライブラリ関数呼び出しを使用して、必要なものを格納できるようにヒープを拡張するようオペレーティング システムに要求します。
今、それはあなたが処理する必要があることを拒否するかもしれません.
次の質問は、2D 配列をどのように求めるかということです。さて、ポインタの配列を要求してから、各ポインタを展開します。
例として、これを考えてみましょう:
int i = 0;
char** words;
words = malloc((num_words)*sizeof(char*));
if ( words == NULL )
{
/* we have a problem */
printf("Error: out of memory.\n");
return;
}
for ( i=0; i<num_words; i++ )
{
words[i] = malloc((word_size+1)*sizeof(char));
if ( words[i] == NULL )
{
/* problem */
break;
}
}
if ( i != num_words )
{
/* it didn't allocate */
}
これにより、2 次元配列が得られます。各要素words[i]
は、単語数と同様に、実行時に決定可能な異なるサイズを持つことができます。
free()
配列を使い終わったら、配列をループして結果のメモリをすべて取得する必要があります。
for ( i = 0; i < num_words; i++ )
{
free(words[i]);
}
free(words);
そうしないと、メモリ リークが発生します。
を使用することもできますcalloc
。違いは、呼び出し規則と効果にあります-calloc
すべてのメモリを初期化しますが、そうでは0
ありmalloc
ません。
実行時にサイズを変更する必要がある場合は、realloc
.
また、重要なのは、私が使用した word_size+1 に注意してください。C の文字列は 0 で終了するため、考慮する必要がある余分な文字が必要です。これを確実に覚えておくために、私は通常、変数word_size
のサイズを単語のサイズ (期待どおりの文字列の長さ) に設定し、0 の malloc に +1 を明示的に残します。次に、割り当てられたバッファーが文字列を取ることができることを知っていますword_size
。これをしなくても問題ありません - 私は明らかな方法でゼロを明示的に説明したいので、そうしています。
このアプローチにはマイナス面もあります。これは、最近出荷されたバグであることがはっきりとわかりました。私が書いたことに注意して(word_size+1)*sizeof(type)
ください - しかし、私が書いたことを想像してみてくださいword_size*sizeof(type)+1
。sizeof(type)=1
これらは同じものですが、Windows はwchar_t
非常に頻繁に使用します。この場合、最後の 0 に対して 2 バイトではなく 1 バイトを予約します。これらは、単一の 0 バイトではなく、型の 0 で終了する要素ですtype
。これは、読み取りと書き込みでオーバーランすることを意味します。
補遺: 好きな方法で実行してください。バッファーに依存するものにバッファーを渡す場合は、ゼロターミネーターに注意してください。