brauche Hilfe bei meinen C Anfängen



  • Hallo Leute,

    ich hab die Thematik mit der Speicher allocierung noch nicht vollends verstanden.

    Ich wollte mir eine kleine String Klasse bauen um damit herum zu spielen.

    String.h

    #include "MemoryTest.h"
    #include <stdbool.h>
    
    typedef char _char;
    typedef unsigned int sizetype;
    
    typedef struct{
        sizetype length;
        _char* data;
    } String;
    
    String mkStringFromChars(_char* str);
    String mkStringForLength(sizetype l);
    void strDelete(String this);
    

    String.c

    #include <stdio.h>
    #include "String.h"
    
    String mkStringFromChars(_char* str)
    {
        sizetype size = 0;
        String* this = (String*) malloc(sizeof(String));
            while (*(str + size) != '\0') {
                size++;
            }
        this->data = str;
        this->length = size;
        return *this;
    }
    
    String mkStringForLength(sizetype l)
    {
        String* this = (String*) malloc(sizeof(String));
        this->data = NULL;
        this->length = l;
        return *this;
    }
    
    void strDelete(String this) {
        free(&this);
    }
    

    Die MemoryTest.h zum zählen aller allocationen bzw. frees;

    MemoryTest.h

    #ifndef __MEMORY_TEST__H__
    #define __MEMORY_TEST__H__
    
    #include <stdlib.h>
    
    extern unsigned int speicherAlloc;
    extern unsigned int speicherFree;
    
    #define free(m)((speicherFree++,free(m)))
    #define malloc(m)((speicherAlloc++,malloc(m)))
    #define calloc(m1,m2)((speicherAlloc++,calloc(m1,m2)))
    
    #endif
    

    Wenn ich nun aber einen main mit test funktionen etc. aufrufe bekomme ich die fehlermeldung:

    String.c:26:5: note: in expansion of macro ‘free’
    free(&this);

    Fragen:

    1. Habe ich grundsätzlich was falsch gemacht bei der erzeugung/allocierung/free das Structs ?

    1.1 muss ich auch den Speicher des "data" feldes im struct neu allocieren ?

    2.Liegt der Fehler an den preprozessor Anweisungen (wenn ich diese nicht mit compeliere klapt es)?

    Hab Vielen Dank

    so long Maxwill



  • Maxwill2000 schrieb:

    1. Habe ich grundsätzlich was falsch gemacht bei der erzeugung/allocierung/free das Structs ?

    Ja.
    Du übergibst der Funktion strDelete eine Kopie deiner struct.
    Und somit versuchst du das lokale Objekt this freizugeben.
    Das geht nicht.

    Aber dir geht ja schon die Adresse vom malloc flöten wenn du return *this; machst.

    Maxwill2000 schrieb:

    1.1 muss ich auch den Speicher des "data" feldes im struct neu allocieren ?

    Wäre ganz sinnvoll.
    Vor allem, wenn du noch strcat nachbaust.

    Maxwill2000 schrieb:

    2.Liegt der Fehler an den preprozessor Anweisungen (wenn ich diese nicht mit compeliere klapt es)?

    Nein.
    Da kennt der Compiler die Deklarationen der (Standard-)Funktionen nicht und kann somit den Fehler auch nicht feststellen.

    Lass dir mal in den Funktionen (auch main) die Adresse von this (wenn es ein Objekt ist) bzw von this selber (wenn es ein Pointer ist) ausgeben und vergleiche. Müßsste alles gleich sein.
    Pointer bzw. Adressen kannst du bei printf mit %p ausgeben.

    printf(" this : %p\n",  this); // bei Pointer
    printf("&this : %p\n", &this); // bei Objekt
    

    Es gibt schon einen Standardisierten sizetyp. Der heißt size_t



  • Hallo Dirk,

    hab vielen dank für deine Antwort.
    Ich hab meinen Denkfehler gefunden, ich brauch den String Struct selbst garnicht zu Allocieren, sondern nur die data im struct.

    Dank dir

    so long Maxwill



  • typedef char _char;
    

    Erkläre mir den für mich unergründlichen Sinn hiervon.


Anmelden zum Antworten