Ich schreibe gerade eine neue String-Struktur in C wie unten und üben Zeigerarithmetik.C Pointer Arithmetik mit Struktur
struct String {
uint32_t check;
uint32_t capacity;
uint32_t length;
char data[1];
} String;
und ich war ein bisschen an diesem Teil des Codes verwechselt
define STRING(s) ((String*)(s - 3*sizeof(uint32_t)))
void utstrfree(char* self) {
// if(*(self - sizeof(uint32_t) * 3) == SIGNATURE) WHY DOES THIS NOT >WORK?
assert((STRING(self)->check) == SIGNATURE); //check if it's a >utstring
free(self-sizeof(uint32_t) * 3); //properly free the malloc and alternative could have been free(STRING(self))
}
ich, wie mein STRING Makro funktioniert verstehen und es funktioniert, aber ich bin nicht ganz sicher, warum meine if-Anweisung nicht der Fall ist Arbeit. Kann mir das jemand erklären?
Off Topic: ist dies magisch Resize "Struct" Trick koscher in modernen Standard C? – user4581301
@ user4581301 Modernes C sollte ein flexibles Array-Element verwenden - 'char data [];', nicht 'char data [1];', sonst ist es legit (die Größe der Strings über char * an das flexible Array-Element zu manipulieren ist ein wenig fischig, obwohl - nicht sehr typsicher. – PSkocik
Nein, @ user4581301, noch war es nie koscher unter irgendeinem vorherigen Standard, obwohl es tatsächlich * normalerweise funktioniert *. In diesen Tagen hat der Standard direkte Unterstützung für diese Art von Dingen über [flexible Array-Mitglieder] (http://port70.net/~nsz/c/c11/n1570.html#6.7.2.1p18). –