我正在尝试使用char * c = s - sizeof(unsigned)检查堆中的a; 但它总是给我带来胡言乱语。我想知道我做错了什么......
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;
}
答案 0 :(得分:1)
恕我直言,0xdeadbeef
的检查应该是
if (*(unsigned*)c == 0xdeadbeef ){
并检查容量
if (*(int*)(c - sizeof(int))< new_capacity){
你拥有它的方式,你正在阅读单个字符而不是整数字,我想你并不打算这样做。
(我认为myStruct
应该是指向ptr
中struct Mystruct
字符串的指针 - 这是对我有意义的唯一方式)
另外,请注意,这不是真正的可移植C,因为编译器可以自由添加填充以对齐struct成员 - 也许berret方法是使用offsetof
宏并获取指向整个结构的指针