2016-09-24 6 views
2

私はCでダイナミクスの配列を作る方法を学ぼうとしている初心者です。コードを使用してコードをビルドするとコードにエラーが発生しません。クラッシュはクラッシュする前にコードが私に希望の出力を与えているので、私は私の記憶を解放している方法と関係していると思います。動的に割り当てられた配列でメモリを解放するにはどうすればよいですか?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 

    int i, j; 
    int *p = (int *)malloc(sizeof(*p)); 

    printf("Hello World! I have created a dynamic array of 20x30 integers! \n"); 
    for (i = 0; i <= 19; i++) 
    { 
     p[i] = (int)malloc(sizeof(int*)); 
     printf(" %2d ", i); 
     for (j = i + 1; j <= 29 + i; j++) 
     { 
     p[i] = 0; 
     printf("%2d", j); 
     } 
    printf("\n"); 
    } 

    for (i = 0; i <= 19; i++); 
    { 
     free(p[i]); 
    } 
    free(p); 
    return 0; 
} 
+4

最初のmallocは、1つのintにスペースを割り当てます。 – tkausl

+2

追加で 'p [i] =(int)malloc(sizeof(int *));'が間違っています。 'p [i]'は 'int'なのでポインタではないので、そこにポインタを格納すべきではありません。多くのシステムでは、 'int'とポインタの大きさが異なり、コードがクラッシュする可能性もあります。 – kaylum

+0

[固定コード](http://ideone.com/WWiYZL) – BLUEPIXY

答えて

0

ここに問題があります。

最初に、最初のmalloc呼び出しは、1要素配列のためのスペースを割り当てます。

あなたは

int *p = (int *)malloc(sizeof(int*) * 20); 

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

からそれを変更したいと思う。そして、あなたの第二のmallocの呼び出しにも少し間違っています。

p[i] = (int)malloc(sizeof(int*)); 

p[i] = (int *)malloc(sizeof(int)); 

に変更する必要がありますあなただけの間違った場所にアスタリスクを置きます。

最後に、実際には20要素の配列を作成するだけです。 inner forループで行うのは、配列内の各セルに値0を割り当てます。あなたは20x30の配列を作成したい場合は、いつでも簡単にルートを取ると1次元配列を作成し、(コンパイラはとにかく非動的2次元配列で何をするか最終的にです)、いくつかの数学を使用することができます。

int main() 
{ 
    int *p = (int *)malloc(sizeof(int) * 600); 
    ... 
    for (i = 0; i <= 19; i++) 
    { 
     printf(" %2d ", i); 
     for (j = 0; j <= 29; j++) 
     { 
      p[i * 30 + j] = 0; // It's i * 30, not i * 20 because you have to skip the space that the 'j' dimension takes up. 
      printf("%2d", j); 
     } 
     printf("\n"); 
    } 

    free((void*)p); //I found the program crashes without the void* cast 
} 

Iこのコードをテストして実行します。

これが役に立ちます。

+1

'int * p;で' p [i] 'は' int'と評価されます。ポインタ( 'malloc()'の結果)を 'int'に格納したくないのです。 – alk

+0

この 'p [i] [j]'もコンパイルされません。 – alk

+0

alk、私はこれを急いで書いて、おそらくエラーがあることを知っていました。私は今、より良い解決策でそれを修正しました。 – anonymoose

関連する問題