-1

大量のデータを文字列の配列に読み込む必要があるプログラムがあり、すべての変数を宣言する初期関数のセット部分があります。問題は、関数の後半まで文字列の配列の実際のサイズがわからないため、配列の長さを見つける行の下で宣言するのではなく、上記の変数を定義してから、行の後にメモリを割り当てたいと思います。私の考えは:

理想:

int declaration;
Char ** DataArray;  //initial declaration at top of file
char * usage;
int Buffer;

//function continues.....

Buffer = SomeNum; //find length of array needed

//allocate ideal size of array(HOW?)

私が現在していること:

int declaration; //not placing the declaration here, bad programming practice especially
char * usage;    //considering this is an open source project i am working on.
int Buffer;

//function continues.....

Buffer = SomeNum;
char * DataArray[Buffer]; //works, but NOT ideal!
4

1 に答える 1

2

あなたがやろうとしていることは、動的メモリ割り当てと呼ばれます。現在使用しているものchar * DataArray[Buffer]は C90 標準の一部ではありません (ただし、C99 標準の一部ですが、C90 の GCC 拡張機能でもあります)、おそらく使用しないでください。

メモリを動的に割り当てるには、 from を使用mallocstdlib.hます。

DataArray = malloc(num_elements * sizeof(char *));

malloc()void *システムが指定したメモリ ブロックの先頭にa を返します。DataArrayこれを( 型の)に割り当てるchar *と、 としてキャストされますchar *

その後、通常の配列の場合と同様に、またはDataArrayを使用して要素を参照できます。DataArray + indexDataArray[index]

静的に割り当てられたメモリとは異なり、動的に割り当てられたメモリは、宣言されたブロックの最後で自動的に解放されません。そのため、使用が終了したら、 を使用free()して解放する必要があります。

free(DataArray);

ただし、与えられたメモリ ブロックへのポインタを失うと、それができなくfree()なり、いわゆるメモリ リークが発生します。動的メモリ割り当てには、考慮しなければならないことがたくさんあります。

たとえば、システムには、提供するのに十分なメモリがない場合があります (または、十分ではあるが、連続したブロックにない場合)。その場合、malloc()が返さNULLれますが、これはもちろん逆参照すべきではありません。

メモリ管理は非常に複雑になる可能性があるため、単に試行錯誤するよりも、本を参考にして学習したほうがよいでしょう。そうすれば、確かにイライラすることははるかに少なくなります。

于 2012-12-01T11:43:07.037 に答える