Problem mit realloc



  • Hi,
    Warum schmiert meine Anwendung bei dem realloc (beiden) ab?

    void CDGraphics::SetDir(const char *Dir) {
    
        if (Dir == NULL) {
            g_Dir = (char*) realloc(g_Dir, 2 * sizeof(char));
            g_Dir = "\0";
        }
    
        else {
            g_Dir = (char*) realloc(g_Dir, sizeof(*Dir));
            strcpy (g_Dir, Dir);
        }
    }
    

    Vorher wird noch ein malloc mit der Grösse von 2char aufgerufen und dann "\0" in g_Dir geschrieben.

    DANKE



  • g_Dir="\0";

    Das setzt nicht den ersten Buchstaben von g_Dir auf 0 sondern der char* g_Dir zeigt jetzt auf eine Zeichenkette bestehend aus 2 \0 zeichen!

    schreib es so:
    *g_Dir=0;

    Dann geht es!

    realloc stuertzt deswegen ab, weil "\0" kein erlaubter string ist -> realloc erwartet einen NULL-Pointer oder einen pointer der von malloc, calloc oder realloc returned wurde!



  • BTW.
    sizeof(char) ist immer 1. Deswegen ist x * sizeof(char) unnötig 🙂



  • Original erstellt von kingruedi:
    BTW.
    sizeof(char) ist immer 1. Deswegen ist x * sizeof(char) unnötig 🙂

    Der Standard definiert die Größe eines chars nicht als absoluten Wert.



  • Was verstehst Du hier unter einem absoluten Wert?
    sizeof gibt die Größe eines Objektes in char zurück. Also ist sizeof (char) gleich 1.



  • Ja, aber sagt der C-Standard denn, daß sizeof(char) genau 1 sein muss?

    Ich dachte, er würde nur sagen, daß

    sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

    gelten muss, oder irre ich da?



  • ISO C99: 6.5.3.4: "... When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1. ..."


Anmelden zum Antworten