2016-05-26 5 views
-1

Was sollte ich darüber nachdenken, wenn ich die Ausgabe verstehe? Weil meine Ausgabe im Moment Müll für 20 ganze Zahlen ist und ich weiß nicht warum. Mein Ziel ist es 20 Arrays mit jeweils 30 Integer zu erstellen. So dass die endgültige Anordnung ganze Zahlen von 19 bis 48.Unsicher auf meine Ausgabe in Bezug auf malloc (c)

#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

Hinweis: '20! = 30' ... und' 20! = 40' – wildplasser

+0

Vielen Dank. Ich drucke immer noch Adressen. (Ich habe die extra for-Schleife gelöscht) –

Antwort

0

habe, werde ich hoffe, ich habe Ihre Frage richtig ...

Was Sie ist nicht immer genau garbase ... Wenn p[i][j] = (int *)malloc(40 * sizeof(int)); tun Sie Ordnen Sie einfach ein weiteres Array mit 40 Elementen zu und setzen Sie seine Adresse in p[i][j] ... Wenn Sie also versuchen, p[(i+1)+j] zu drucken, drucken Sie die Adresse des 40-Elemente-Arrays, das Sie mallocadiert haben.

0

Es gibt mehrere Probleme mit Ihrem Code sind:

  • Für die anfängliche Zuteilung, jedes Element ein int *, so müssen Sie 20 * sizeof(int *), nicht 20 * sizeof(int).
  • Jeder von malloc zugewiesene Speicherplatz ist nicht initialisiert, daher ist der Versuch, es zu lesen, ein nicht definiertes Verhalten. Wenn Sie andererseits calloc verwenden, initialisiert dies den zugewiesenen Speicher für alle 0.
  • Sie durchlaufen einen zusätzlichen Satz von Schleifen, die versuchen, jedem int Standort ein weiteres Array zuzuweisen. Wenn Sie versuchen würden, ein 3D-Array zu erstellen (und als int *** definiert), das funktionieren würde, aber nicht für ein 2D-Array.
  • Den Rückgabewert von malloc nicht darstellen, da dies geringfügige Fehler maskieren kann.

Wenn Sie möchten, um dynamisch einen 20 x 30-Array von int zuweisen, tun Sie es wie folgt aus:

// 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); 
    } 
} 

Beachten Sie, dass diese Einstellung keine Werte in der 2D-Array, es ist nur zuordnet die Erinnerung dafür.