2016-12-31 5 views
-1

私はintへのポインタの配列を、すべて動的メモリ割り当てによって構築する必要があります。 Iが宣言で開始:(サイズ= 1)ポインタの配列の問題

queue[*size-1] = (int*)calloc(1,sizeof(int)); 

iは整数をスキャン

int** queue = (int**)malloc(sizeof(int*)); 

と比べ:

printf("Enter item value to add\n"); 
    scanf("%d",queue[*size-1]); 
    printf("Item %d added\n",*(queue[*size-1])); 

これらのすべてのコードは同じ機能であり、正常に動作し。 が、私は別の関数で、このキューから何かを印刷したりすることによって、メモリを解放しようとすると:

for(i = 0;i<size;i++) 
    { 
     free(queue[i]); 
    } 
    free(queue); 

プログラムがクラッシュ。 私はいくつかの助けが大好きです。 ありがとうございます!サイズが2以上であれば、あなたが割り当てられていないので、あなたがundifenied行動(例えばクラッシュ)を取得キューにmemeoryに取り組むよう

+2

であなたのコードの残りの部分から想定しています'* size-1'は'(* size)-1'や '*(size-1)'になっていますか? ([演算子の優先順位](http://en.cppreference.com/w/c/language/operator_precedence)を参照してください)。また、[mallocの返り値をキャストしない](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – UnholySheep

+3

'size'は何と宣言されていますか?あなたの説明から、それは単一の整数値であると思われます。その場合、ポインタを使ってアクセスする理由を理解できません。 – UnholySheep

+0

(* size)-1 –

答えて

1
int** queue = (int**)malloc(sizeof(int*)); 

は、1つの要素を保持するのに十分なメモリを割り当てます。

割り当てられたメモリのキューをたとえば10にするには、十分なメモリを割り当てる必要があります。

int** queue = (int**)malloc(sizeof(int*) * 10); 

enter image description here

あなたは、その要素の先頭に、すべての要素、およびキューポインティングを保持するために赤い部分が十分に長いようにする必要があります。

あなたがキュー固定長作りたくない場合は、あなたがのreallocを使用することができ、

int** queue = (int**)realloc(queue, sizeof(int*) * ((*size)+1)); // resize red part 
queue[(*size)-1] = (int*)calloc(1,sizeof(int)); // Creating the green part 

そして、ここでのように、私はサイズがint *size

+0

upvoteどのようなエディターを使用して画像を描画しましたか? – coderredoc

+0

ユーザーがキューにもう1つのアイテムを追加することを選択した場合は、reallocを使用します。 –

+0

@coderredoc - それはGoogleの図面 – Soren