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 Struktur name 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.


Log in to reply