Ich frage mich, was ist die beste Strategie für die Zuweisung von Speicher für eine Struktur mit vielen Zeigern innerhalb.Beste Strategie in dynamischer Zuordnung in C für strcut mit vielen Zeigern
So:
struct Test{
long unsigned int size;
double *A;
int *B;
double *C;
};
Dann könnte ich viele Zuweisungen wie folgt verwenden:
struct Test *alloc_test(long unsigned int size){
struct Test *ans = (struct Test*)malloc(sizeof(struct Test));
if(ans == NULL){
return NULL;
}
ans->size = size;
ans->A = (double *)malloc(sizeof(double)*size);
if(ans->A == NULL){
free(ans);
return NULL;
}
ans->B = (int *)malloc(sizeof(int)*size);
if(ans->B == NULL){
free(ans->A);
free(ans);
return NULL;
}
ans->C = (double *)malloc(sizeof(double)*size);
if(ans->C == NULL){
free(ans->A);
free(ans->B);
free(ans);
return NULL;
}
return ans;
}
Oder ich könnte eine einzelne Zuordnung, wie diese USI:
struct Test *alloc_test(long unsigned int size){
long unsigned int mem_size = sizeof(struct Test) + sizeof(double)*2*size + sizeof(int)*size;
struct Test *ans = (struct Test*)malloc(mem_size);
if(ans == NULL){
return NULL;
}
ans->size = size;
ans->A = ans + sizeof(struct Test);
ans->B = ans->A + sizeof(double)*size;
ans->C = ans->B + sizeof(int)*size;
return ans;
}
Diese Dies ist in diesem Fall möglich, da dieses Objekt nicht erneut zugeordnet werden soll. Kennt jemand in diesem Fall den Vorteil eines jeden?
'ans-> Größe = Größe; ans-> A = ans + Größe von (Struct Test); ans-> B = ans-> A + Größevon (doppelt) * Größe; ans-> C = ans-> B + sizeof (int) * Größe; 'ist die falsche Zeigermathematik. Von diesem Ansatz abraten. – chux
Der Zeiger des zweiten Ansatzes ist falsch. Müsste etwas wie 'ans-> A = (void *) (ans + 1) verwenden; ans-> B = (void *) (ans-> A + Größe); ans-> C = (void *) (ans-> B + Größe); '. Dies stellt jedoch die wichtigen Ausrichtungsprobleme außer Kraft, die weitere Codeanpassungen erforderten. Es empfiehlt sich, die zweite Methode erst dann zu verwenden, wenn die Mathematik und Ausrichtung des Masters beherrscht werden. – chux