Вопрос
Я пытаюсь проверить в куче значение char * c = s - sizeof (без знака); Но это всегда возвращает мне бред. Мне интересно, что я сделал не так ...
typedef
struct String {
int length;
int capacity;
unsigned check;
char ptr[0];
} String;
char* modelStrrealloc(char* myStruct, int new_capacity){
char* c = myStruct - sizeof(unsigned);
int length = strlen(s);
String *string;
if (c == 0xdeadbeef ){
printf("1st if statement");
if (*(c - sizeof(int))< new_capacity){
string = malloc(sizeof(String) + new_capacity + 1);
printf("if statement");
assert(string != 0);
(*string).length = length;
(*string).capacity = new_capacity + 1;
strcpy(string->ptr, myStruct);
(*string).check = "~0xdeadbeef";
modelStrfree(myStruct);
return string->ptr;
}
}
return myStruct;
}
Решение
ИМХО, проверка для 0xdeadbeef
должна читаться
if (*(unsigned*)c == 0xdeadbeef ){
и проверка емкости
if (*(int*)(c - sizeof(int))< new_capacity){
Как у вас это получается, вы читаете отдельные символы вместо целых, и я думаю, что вы этого не собирались.
(я предполагаю, что myStruct
должен быть указателем на строку ptr
в struct Mystruct
- это единственный способ, который имеет смысл для меня ) р>
Также обратите внимание, что это на самом деле не переносимый Си, потому что компилятор может свободно добавлять отступы для выравнивания членов структуры - возможно, подход Беррета будет заключаться в использовании макроса offsetof
и получении указателя на вся структура.