malloc in typedef
-
Hallo
ich habe folgenden Code:
typedef struct DT_MATRIX{ int m; int n; float *matrix = (float*) malloc(sizeof(float)); }dt_matrix;
dem Kompiler fällt dazu nicht besseres ein als:
abatyp.h:22: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token
Was hat der Kompiler dagegen? Ich finde keinen Fehler.
Wenn ich den gleichen Code außerhalb von typedef teste funktionierts doch auch?!?!?!?!?!?Wer weiß was?
-
der Fehler liegt daran, dass soetwas in C nicht erlaubt ist.
struct name {};
ist nur dazu da, dem Compiler mitzuteilen, wie deie Strukturname
aussieht und nicht was sie enthält. Dazu musst du ein Objekt haben:void foo(void) { dt_matrix obj; obj.matrix = malloc(sizeof *(obj.matrix)); }
//edit: danke an namespace invader
-
Dann geht also das nur so?!:
typedef struct DT_MATRIX{ int m; int n; float *matrix; }dt_matrix; dt_matrix neumat; neumat.m = 2; neumat.n = 2; neumat.matrix = (float*) malloc(sizeof(float)*neumat.m*neumat.n);
-
ja, und
malloc
benutzt du falsch (beachte deine Benutzung und meine). Siehe Dynamischer Speicher mit malloc/calloc/realloc/free
-
supertux schrieb:
obj.matrix = malloc(sizeof obj.matrix);
Da fehlt aber ein Sternchen, sonst macht es wenig Sinn. Zusammen mit m und n also
obj.matrix = malloc(sizeof *obj.matrix * m * n);
Wenn man mag kann man natürlich die ganze Struktur auf einmal initialisieren, also
dt_matrix obj = { .m = m, .n = n, .matrix = malloc(sizeof *obj.matrix * m * n) };
Und wenn man nicht nur das Array selber, sondern gleich die ganze Struktur dynamisch allozieren will, kann man das auch so auf einmal machen:
typedef struct DT_MATRIX{ int m; int n; float matrix[]; } dt_matrix; /*...*/ dt_matrix *obj = malloc(sizeof *obj + n * m * sizeof *obj->matrix); if (!obj) goto fail; *obj = (dt_matrix){.m = m, .n = n};
-
namespace invader schrieb:
supertux schrieb:
obj.matrix = malloc(sizeof obj.matrix);
Da fehlt aber ein Sternchen, sonst macht es wenig Sinn.
Upps, stimmt, hab so schnell getippt, dass ich es gar nicht bemerkt habe.