В настоящее время я пишу новую структуру String в C, как показано ниже, и практикую арифметику указателей.C указатель арифметики со структурой
struct String {
uint32_t check;
uint32_t capacity;
uint32_t length;
char data[1];
} String;
, и я был немного смущен этой части кода
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))
}
Я понимаю, как мой STRING макрос работает и работает правильно, но я не совсем уверен, почему мое заявление, если не Работа. Кто-нибудь может мне это объяснить?
Отключить тему: это волшебное изменение размера 'struct' trick kosher в современном стандарте C? – user4581301
@ user4581301 Современный C должен использовать гибкий элемент массива - 'char data [];', а не 'char data [1];', в противном случае это законно (манипуляция строками размера через char * с гибким элементом массива немного рыбный, хотя - не очень безопасный тип). – PSkocik
Нет, @ user4581301, и он никогда не был кошерным по любому предыдущему стандарту, хотя на самом деле он обычно * работает *. В наши дни стандарт имеет прямую поддержку такого рода вещей через [гибкие элементы массива] (http://port70.net/~nsz/c/c11/n1570.html#6.7.2.1p18). –