Christian Seiler: Anfängerfrage zu Strings in C

Beitrag lesen

Hallo,

D.h. free(mystrings[0]) und free(mystring[1]), also die Pointer auf den reservierten Speicher für die Strings. free bekommt im Grunde die Adresse übermittelt, bzw. hat sich C in dem Zusammenhang mit der Adresse gemerkt, welcher Datentyp und welche Größe damit verunden ist?

Datentyp ist ja für das Allozieren und Freigeben von Speicher egal - malloc übergibst Du ja auch nur die Größe, der Cast davor dient nur der Klarheit.

Und in der Regel werden im Speicher unmittelbar *vor* dem von malloc zurückgegebenen Speicherbereich "Buchhaltungsinformationen" gespeichert (wie genau das aussieht ist Implementierungsabängig), d.h. malloc(n) macht folgendes:

vorher:

----------------------------------------------------------------------
                  ..............
 ----------------------------------------------------------------------

nachher:

-----------+--------+------------------------------------------+------
    ...     | intern | Speicherbereich                          | ...
 -----------+--------+------------------------------------------+------
             ^        ^
             |        |
             |        Zeiger, der von malloc() zurückgegeben wird
             Intern verwendeter Speicher mit "Buchhaltungsinfos"

Damit kann free() wissen, wie viel Speicher wieder frei wird.

Bedenke: free() ist auch nur eine Funktion, die einen void*-Zeiger bekommt, d.h. irgendwo in Deiner C-Standardlib ist sowas enthalten wie:

void free (void *ptr) {
 // tu was, damit der Bereich, auf den ptr zeigt, wieder frei ist
}

Könnte ich, dem Verständnis halber, "int a = (int)&mystring[1]" (weise dem integer a die adresse von mystring[1] zu) und dann free((char*)a); (befreie den Speicher der aus dem integer zurückverwandelten Adresse(Pointer))?

In x86: Ja.
In x86_64: Nein.

In x86 sind sowohl int als auch Speicheradressen 32bit - kein Problem.
In x86_64 ist in 32 bit und Speicheradressen sind 63bit - Informationen gehen also verloren.

Es gibt einen speziellen Zahlendatentyp, der dafür vorgesehen ist, Speicheradressen zu halten, nennt sich size_t, ist in sys/types.h definiert.

size_t a = (size_t)&mystring[1]; free((char*)a); würde also überall so wie von Dir gewünscht funktionieren (wäre nur reichlich sinnlos).

Viele Grüße,
Christian