/ /動的メモリ割り当てC-c、配列、リンクリスト

動的メモリ割り当てC - C、配列、リンクされたリスト

私の問題は固定配列の変換が必要ですサイズから動的メモリ割り当て。あらゆる種類のcalloc、malloc、およびrellocステートメントを試しましたが、何も機能していないようです。 void * dataポインタでさえ役に立たなかったと思います。

後で配列のサイズを変更できるように、このコードを動的メモリ用に変換してください。また、この配列がノードポインターになるように、リンクリストを使用しています。

Node *lists[100]  //this does my job
lists[listNo] = NULL;

mallocを使用したい場合:

Node *lists = (Node) malloc(100*sizeof(Node));
lists[listNo] = NULL; // gives me error when I use malloc or calloc and the error is assigning Node from void*

回答:

回答№1は5

問題は、mallocを使用する場合、リストをポインターの配列へのポインターとして定義する必要があることです。

 Node **lists = malloc(100*sizeof(Node*));
lists[listNo] = NULL;

回答№2の場合は3

あなたの主張に基づいて:

Node *lists[100]

...仕事をします、そしてそれは100個のポインタの配列です(タイプするために) Node)。その通常の可変長バージョンは次のとおりです。

Node **lists; /* points to first pointer in dynamic array */
int lists_size; /* you need a variable to hold the size */

配列が非常に大きい場合は、 size_t から <stdlib.h> intの代わりに、intは小さな配列とインデックス変数で使用する方が簡単です。それを割り当てます:

lists_size = 100; /* replace 100 with a computed size */
lists = (Node**)calloc(lists_size, sizeof (Node*));

つかいます lists_size コードやその他すべての100の代わりに同じように動作します。 malloc()の代わりにcalloc()を使用すると、割り当てられたメモリがバイナリゼロにクリアされ、実際の実装ごとにNULLポインタを格納するためのループが不要になります。 (技術的には、C標準ではNULLがゼロである必要はありません。少なくとも、前回調べたときには必要ありませんでしたが、数メガトンのUnixとWindowsのコードでこれが必要です。)