Ich muss mehrere Arrays des gleichen Typs und Form zuweisen. Am Anfang habe ich so etwas wie:Zuweisung mehrerer Arrays des gleichen Typs
void alloc_arrays_v1(size_t nmemb)
{
int *a1, *a2, *a3;
a1 = malloc(nmemb * sizeof int);
a2 = malloc(nmemb * sizeof int);
a3 = malloc(nmemb * sizeof int);
/* do some stuff with the arrays */
free(a1);
free(a2);
free(a3);
}
zu vermeiden Um malloc
und free
mehrmals aufrufen, änderte ich die oben in:
void alloc_arrays_v2(size_t nmemb)
{
int *a, *a1, *a2, *a3;
a = malloc(3 * nmemb * sizeof int);
a1 = a;
a2 = a1 + nmemb;
a3 = a2 + nmemb;
/* do some stuff */
free(a);
}
Dies scheint in Ordnung zu sein (in dem Sinne, dass die Funktionen Verhalten Sie sich im realen Fall genauso), aber ich frage mich, ob das immer noch C-Code ist (undefiniertes Verhalten?), und ob ich diese Methode auf komplexe Datenarten (Arrays von Strukturen usw.) erweitern kann.
Sein völlig gültiger C-Code, und ja, Sie können es mit anderen Typen einschließlich Strukturen (Zeigerarithmetik funktioniert nur, wenn Sie es lassen, und Sie lassen es einfach gut). Führen Sie es in einem Debugger aus und berechnen Sie die Adressen, die mit "a" beginnen, um dies zu bestätigen. – WhozCraig
@WhozCraig: Ich mache das in der realen Welt :) – michaelmeyer
Nicht sicher, was das mit dem Debuggen zu tun hat, wie ich * viel * reellen Code debuggen. Aber es ist hilfreich, Schritt für Schritt Zeile für Zeile in Aktion zu sehen. Glauben Sie nicht, dass Debugger hilfreich sind, nur um Fehler zu finden; Sie sind ebenso fantastische Werkzeuge, um * gültigen * Code zu untersuchen und zu sehen, wie er auf der gewählten Plattform funktioniert. – WhozCraig