Pregunta
Estoy tratando de verificar un en el montón con char * c = s - sizeof (unsigned); Pero siempre me devuelve galimatías. Me pregunto qué hice mal ...
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;
}
Solución
En mi humilde opinión, la comprobación de 0xdeadbeef
debería leer
if (*(unsigned*)c == 0xdeadbeef ){
y la verificación de capacidad
if (*(int*)(c - sizeof(int))< new_capacity){
De la forma en que lo tiene, está leyendo caracteres individuales en lugar de ints, y creo que no tenía la intención de esto.
(Supongo que myStruct
debería ser un puntero a la cadena ptr
en struct Mystruct
: esta es la única forma en que tiene sentido para mí )
Además, tenga en cuenta que esto no es realmente C portátil, ya que el compilador es libre de agregar relleno para alinear los miembros de la estructura; tal vez un enfoque de Berret sería usar la macro offsetof
y obtener el puntero para toda la estructura.