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.
Was genau ist die Idee dahinter: '... = * inner;'? – alk
@alk für diesen Index im äußeren Array, weisen Sie einen neuen Speicherplatz zu. – marcusshep
kann hilfreich sein, obwohl die Frage von C++ ist: http://StackOverflow.com/questions/4316736/using-unallocated-memory-without-error – Cherubim