根据 C 中声明的顺序释放结构的元素时出错
Error when freeing elements of a struct depending on the order they are declared in C
我有以下结构:
typedef struct {
char* json;
char* jsonBody;
char* tokens;
int max_json_size;
int max_num_tokens;
int num_tokens;
} JsonResponse;
如果我执行以下代码,一切都会按预期进行:
JsonResponse* self = malloc(sizeof(self));
self->tokens = malloc(sizeof(self->tokens)*1024);
free(self->tokens);
free(self);
但是当我在 *tokens 的正下方分配变量时,在这种情况下 *max_json_size 代码崩溃了,例如这段代码会崩溃:
JsonResponse* self = malloc(sizeof(self));
self->tokens = malloc(sizeof(self->tokens)*1024);
self->max_json_size = 1024;
free(self->tokens); //crash here
free(self);
这仅发生在结构中 *tokens 指针正下方的变量上,因此在该示例中分配变量 num_tokens 工作正常。如果我将 *tokens 移动到结构的底部,一切似乎也能正常工作,但我担心它可能是一个定时炸弹。我想过在中间放一个"padding" int,这可能也能解决问题。
但我想知道我在这段代码中做错了什么,任何帮助将不胜感激,我一无所知。到底是怎么回事?
这是在任天堂 3ds 系统上进行编程以防相关。
您分配的大小有误。
JsonResponse* self = malloc(sizeof(self));
你分配的是指针的大小而不是缓冲区的大小…
我有以下结构:
typedef struct {
char* json;
char* jsonBody;
char* tokens;
int max_json_size;
int max_num_tokens;
int num_tokens;
} JsonResponse;
如果我执行以下代码,一切都会按预期进行:
JsonResponse* self = malloc(sizeof(self));
self->tokens = malloc(sizeof(self->tokens)*1024);
free(self->tokens);
free(self);
但是当我在 *tokens 的正下方分配变量时,在这种情况下 *max_json_size 代码崩溃了,例如这段代码会崩溃:
JsonResponse* self = malloc(sizeof(self));
self->tokens = malloc(sizeof(self->tokens)*1024);
self->max_json_size = 1024;
free(self->tokens); //crash here
free(self);
这仅发生在结构中 *tokens 指针正下方的变量上,因此在该示例中分配变量 num_tokens 工作正常。如果我将 *tokens 移动到结构的底部,一切似乎也能正常工作,但我担心它可能是一个定时炸弹。我想过在中间放一个"padding" int,这可能也能解决问题。
但我想知道我在这段代码中做错了什么,任何帮助将不胜感激,我一无所知。到底是怎么回事?
这是在任天堂 3ds 系统上进行编程以防相关。
您分配的大小有误。
JsonResponse* self = malloc(sizeof(self));
你分配的是指针的大小而不是缓冲区的大小…