Question
J'essaie de vérifier a dans le tas avec char * c = s - sizeof (unsigned); Mais cela me renvoie toujours du charabia. Je me demande ce que j'ai fait de 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;
}
La solution
IMHO, la vérification de 0xdeadbeef
doit indiquer
if (*(unsigned*)c == 0xdeadbeef ){
et le contrôle de capacité
if (*(int*)(c - sizeof(int))< new_capacity){
Comme vous l'avez, vous lisez des caractères isolés au lieu d'ints, et je pense que vous n'aviez pas l'intention de le faire.
(Je suppose que myStruct
devrait être un pointeur sur la chaîne ptr
dans struct Mystruct
- c'est la seule façon dont cela a du sens pour moi )
Notez également qu'il ne s'agit pas vraiment d'un C portable, car le compilateur est libre d'ajouter du rembourrage pour aligner les membres de la structure. Une approche berret consisterait à utiliser la macro offsetof
et à placer le pointeur sur l'ensemble de la structure.