gpt4 book ai didi

c - Valgrind 地址在线程的 1 堆栈上

转载 作者:太空狗 更新时间:2023-10-29 16:12:56 25 4
gpt4 key购买 nike

我这辈子都弄不清楚自己做错了什么。

T* tokenizer = create(argv[1], argv[2]);
destroy(tokenizer);

结构如下:

struct T_
{
char *sep_set;
char *str;
char *token;
int *last_index;
};
typedef struct T_ T;

这是创建函数:

T *create(char *separators, char *ts)
{
T *tk = malloc(sizeof(struct T_));
tk->sep_set = malloc(sizeof(char)*strlen(separators));
tk->str = malloc(sizeof(char)*strlen(ts));
tk->last_index = malloc(sizeof(int));
tk->sep_set = separators;
tk->str = ts;
*tk->last_index = 0;
return tk;
}

void destroy(T *tk)
{
free(tk->sep_set);
free(tk->str);
free(tk->last_index);
free(tk);
}

我的错误是:

==12302== Invalid free() / delete / delete[] / realloc()
==12302== at 0x4C273F0: free (vg_replace_malloc.c:446)
==12302== by 0x400649: destroy (t.c:58)
==12302== by 0x40088C: main (t.c:145)
==12302== Address 0x7ff0006e7 is on thread 1's stack
==12302==
==12302== Invalid free() / delete / delete[] / realloc()
==12302== at 0x4C273F0: free (vg_replace_malloc.c:446)
==12302== by 0x400659: destroy (t.c:59)
==12302== by 0x40088C: main (t.c:145)
==12302== Address 0x7ff0006ec is on thread 1's stack

第 58 和 59 行是

free(tk->sep_set);
free(tk->str);

如有任何帮助,我们将不胜感激!

最佳答案

您对 C 中字符串的掌握似乎让您失望了。

这个:

tk->sep_set = malloc(sizeof(char)*strlen(separators));
tk->sep_set = separators;

是错误的,它用 separators 参数指针覆盖 malloc() 返回的指针,将句柄丢弃到泄漏的内存中。然后将错误的指针传递给无效的 free()

应该是:

tk->sep_set = strdup(separators);

如果你有它,否则:

if((tk->sep_set = malloc(strlen(separators) + 1)) != NULL)
strcpy(tk->sep_set, separators);

几点:

  1. 您必须将长度加 1 以便为 '\0' 终止符腾出空间。
  2. 您不需要按 sizeof (char)“缩放”,它保证为 1,所以它只是困惑。
  3. 您必须检查 malloc() 是否失败。
  4. 您必须使用 strcpy() 复制字符串。

对于 str 字段也是如此(使用 ts 参数)。

关于c - Valgrind 地址在线程的 1 堆栈上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18746774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com