Pergunta
Eu estou tentando verificar um na pilha com char * c = s - sizeof (unsigned); Mas ele sempre retorna jargão para mim. Eu estou querendo saber o que foi que eu fiz de errado ...
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;
}
Solução
IMHO, o cheque para 0xdeadbeef
deve ler
if (*(unsigned*)c == 0xdeadbeef ){
e a verificação de capacidade
if (*(int*)(c - sizeof(int))< new_capacity){
A forma como você tem isso, você está lendo caracteres simples em vez de ints, e eu acho que você não pretendia isso.
(presumo myStruct
deve ser um ponteiro para a cadeia ptr
em struct Mystruct
- esta é a única maneira que faz sentido para mim)
Além disso, nota que este não é realmente portátil C, porque o compilador é livre para adicionar preenchimento para os membros de struct align -. Talvez uma abordagem berret seria usar a macro offsetof
e obter o ponteiro para toda a struct