2016-05-26 3 views
-1

出力を理解する際にはどう考えるべきですか?なぜなら、私の出力は20の整数のためのガベージであり、私は理由を知りません。私の目的は、それぞれ30個の整数で20個の配列を作成することです。だから、最後の配列は何を取得していることは、正確ではありませんmalloc(c)に関する私の出力にはわかりません

私は...私は右のあなたの質問を得た願っています48

#include <stdio.h> 

#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 

int **p;//Declaration of a pointer variable 
int i = 0, j; 
int rows = 20; 
int columns = 30; 

    p = (int**)malloc(20 * sizeof(int)); //First "bookend" allocates space 
    printf("Hello World! I have created a dynamic 20-array of 20x30 integers!\n"); 

if (p == NULL) 
{ 
    printf("Failed to allocated memory!"); 
    exit(1); 
} 



for (i = 0; i < 20; i++) 
{ 
    if (p[i] == NULL) 
    { 
     printf("Integers not allocated! "); 
    } 
    p[i] = (int**)malloc(20 * sizeof(int)); 
} 


for (i = 0; i < 20; i++) 
{ 
    for (j = 0; j < 20; j++) 
    { 
     if (p[j] == NULL) 
     { 
      printf("Integers not allocated! "); 
     } 
     p[i][j] = (int *)malloc(40 * sizeof(int)); 

    } 
    printf("%d\n", p[(i+1)+j]); 
} 

free(p); 

return 0; 
} 
+0

注: '20!= 30' ...と' 20!= 40' – wildplasser

+0

ありがとうございます。私はまだ住所を印刷しています。 (私は余分なforループを削除しました) –

答えて

0

に19の整数を持つことになりますgarbase ...ときあなたはp[i][j] = (int *)malloc(40 * sizeof(int));をやって1つ以上の配列を40要素で割り当てて、そのアドレスをp[i][j]に入れます。p[(i+1)+j]を印刷しようとすると、40要素の配列のアドレスが出力されます。

0

あなたのコードにはいくつかの問題があります:最初の割り当てについては

  • は、各要素がint *あるので、あなたは20 * sizeof(int *)、ない20 * sizeof(int)を必要としています。
  • mallocによって割り当てられた領域はすべて初期化されていないため、それを読み取ろうとすると未定義の動作になります。一方、callocを使用すると、割り当てられたメモリはすべて0に初期化されます。
  • intの各場所に別のアレイを割り当てようとする一連のループを通過します。 2D配列では機能しない3D配列を作成しようとしていた(をint ***と定義した)場合。
  • mallocの戻り値をキャストしないでください。微妙なバグを隠すことができます。

あなたが動的にintの20 X 30の配列を割り当てたい場合、あなたはこのようにそれを実行します。これは2次元アレイ内の任意の値を設定していない、それだけで割り振ること

// first allocate 20 int* 
int **p = malloc(20 * sizeof(int *)); 
if (p == NULL) { 
    perror("malloc failed"); 
    exit(1); 
} 

int i; 
for (i=0;i<30;i++) { 
    // for each row, allocate 30 int 
    p[i] = malloc(30 * sizeof(int)); 
    if (p[i] == NULL) { 
     perror("malloc failed"); 
     exit(1); 
    } 
} 

は注意そのための記憶。

関連する問題