Ich stellte mir zufällig eine Frage über Arrays in C++. Nun, wir alle wissen, dass Arrays feste Sammlungen von etwas sind, sage ich behoben, weil es notwendig ist, Array-Länge bei der Definition von Arrays zu deklarieren. Nun, lassen Sie uns ein Beispiel betrachten:Umgang mit Array-Größe
char myarray[10] = {'\0'};
int sz = sizeof(myarray); // It is supposed to be 10
Nun, es ist richtig, 10 die Zahl von sizeof zurückgegeben wird. Dies kann vom Compiler erledigt werden, da er weiß, wie viel Platz er für diese Variable einnimmt.
Betrachten wir nun, was in dieser Situation passiert:
void dosome(mystruct* arr) {
int elements = sizeof(arr)/sizeof(mystruct);
for (int i = 0; i < elements; i++) {
// Do something hoping no overflow will ever occur
}
}
Nizza ... aber ich nehme an, es Überlauf anfällig sein kann. Wenn ich auf diese Funktion ein Array übergebe ich in einer „normalen“ Art und Weise erstellt, soll alles in Ordnung sein:
mystruct array[20];
dosome(array);
Kein Problem. Aber wenn ich dies tun:
mystruct* array = (mystruct*)malloc(80*sizeof(mystruct));
dosome(array);
WAS PASSIERT ??????????????????? Ich möchte gerne verstehen, wie sich die Größe verhält, diese Funktion wird zur Kompilierzeit richtig ausgewertet ??? ok, was passiert wenn ich kein Array benutze, aber etwas sehr umständliches wie ein Datenblock wie dieser? außerdem könnte ich es mit einem weiteren Aufruf an malloc erneut zuweisen und Dosome bitten, diesen Datenblock erneut zu verarbeiten. Wird es funktionieren? Ich könnte es physisch versuchen, aber ich würde eine genaue Antwort über das Verhalten von sizeof bekommen.
Vielen Dank.
In 'dosome',' sizeof (arr) 'ist' sizeof (mystruct *) 'unabhängig von der Art und Weise der Funktion – icecrime
aufgerufen wird Wenn Sie in C++ entwickeln, Verwenden Sie dann 'new' anstelle von' malloc' wann immer möglich.Verhält sich Ihr Code immer noch falsch, wenn Sie Ihr Array wie folgt definieren: 'mystruct * array = new mystruct [20];'? – suszterpatt
icecrime hat recht, du hast falsche Erwartungen – Simone