2016-11-18 3 views
1

Ich versuche, mich voll und ganz auf die Malloc- und Speicherzuweisung zu konzentrieren. Ich bin kürzlich auf eine Situation gestoßen, die mich dazu gebracht hat, eine Augenbraue zu heben.Malloc wird nicht benötigt, um ein inneres Array zu erstellen

Beim Herumspielen mit Arrays habe ich ein Array von Arrays erstellt. Welches in meinem Kopf ungefähr so ​​aussehen würde: [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], ...] Wenn ich dies tat, dachte ich, da ich malloc brauchte, um die äußere Reihe zu schaffen. Ich musste für jedes innere Array, das ich erstellte, auch malloc aufrufen. Mir wurde schnell klar, dass ich die gleiche Ausgabe bekomme, wenn ich diesen Schritt überspringe, der für mich keinen Sinn ergibt.

Betrachten Sie das folgende Skript.

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

    // initialize outer array 
    int* outer = malloc(5 * sizeof(int)); 

    int i, j; 

    // for each slot in outer array 
    // create a new array and assign it 
    // to that slot. 
    // NOT NEEDED. 
    for(i = 0; i < 5; i++){ 
     int* inner = malloc(5 * sizeof(int)); 
     *(outer + i) = *inner; 
    } 
    // If I comment out the above four lines 
    // the output remains the same. 

    // assign to each slot in each inner array 
    for(i = 0; i < 5; i++) 
     for(j = 0; j < 5; j++) 
      *(outer + i * 5 + j) = j; 

    // print each element in each inner array 
    for(i = 0; i < 5; i++){ 
     for(j = 0; j < 5; j++){ 
      printf(
       "%d ", 
       *(outer + i * 5 + j) 
      ); 
     } 
     puts(""); 
    } 
} 

Die Ausgabe von diesem Skript ist wie folgt:

0 1 2 3 4 
0 1 2 3 4 
0 1 2 3 4 
0 1 2 3 4 
0 1 2 3 4 

Welche ist das, was ich erwartet hatte. Aber wenn ich die erste for-Schleife im Skript auskommentiere, bekomme ich die gleiche Ausgabe. Warum ist das? Muss ich keinen Speicher für die inneren Arrays zuweisen? Offensichtlich ist die Antwort nein, aber ich versuche zu verstehen, warum das so ist.

+0

Was genau ist die Idee dahinter: '... = * inner;'? – alk

+0

@alk für diesen Index im äußeren Array, weisen Sie einen neuen Speicherplatz zu. – marcusshep

+2

kann hilfreich sein, obwohl die Frage von C++ ist: http://StackOverflow.com/questions/4316736/using-unallocated-memory-without-error – Cherubim

Antwort

2

Kurze Antwort: Undefined behavior.

Wenn Sie keinen Speicher für die inneren Arrays zuweisen können, sind die Zeiger nicht initialisiert, sodass sie auf einen nicht angegebenen Speicherort verweisen.

Mit undefiniertem Verhalten kann Ihr Programm abstürzen, es kann sich unerwartet verhalten oder es funktioniert (wie in Ihrem Fall) korrekt. Eine scheinbar nicht zusammenhängende Änderung wie das Hinzufügen nicht verwendeter Variablen kann dazu führen, dass sich das Verhalten des Programms ändert.

+0

Also war meine erste Intuition, Speicher für jedes innere Array zu reservieren, korrekt? – marcusshep

+0

@marcusshep Richtig, Sie müssen Speicher für das innere Array reservieren. – dbush

Verwandte Themen