【问题标题】:Error when freeing elements of a struct depending on the order they are declared in C [duplicate]根据在 C 中声明的顺序释放结构的元素时出错 [重复]
【发布时间】:2026-02-07 03:25:01
【问题描述】:

我有以下结构:

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 移动到结构的底部,一切似乎也可以正常工作,但我担心它可能是一个定时炸弹。我想过在中间放一个“填充”int,这也可能解决问题。

但我想知道我在这段代码中做错了什么,任何帮助将不胜感激,我一无所知。到底是怎么回事?

这是在任天堂 3ds 系统上编程的,以防万一。

【问题讨论】:

  • JsonResponse* self = malloc(sizeof(self)) 在这里你为指针分配内存,你想要JsonResponse* self = malloc(sizeof(*self))
  • 投票结束这个简单的错字。

标签: c struct malloc free devkitpro


【解决方案1】:

您分配了错误的大小。

JsonResponse* self = malloc(sizeof(self));

你分配的是指针的大小而不是缓冲区的大小……

【讨论】:

  • 出于同样的原因,self->tokens = malloc(sizeof(self->tokens)*1024); 也分配了错误的大小,尽管它分配了太多空间(用于 1024 个指针的空间)而不是没有足够的空间。 (我假设sizeof(char*) > sizeof(char)。)