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;
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top