gpt4 book ai didi

c - 使用 free() 后字符串变成垃圾

转载 作者:行者123 更新时间:2023-11-30 19:42:08 26 4
gpt4 key购买 nike

我使用 typedef person_t 在 person 结构中创建一个人:

int main(int argc, char* argv[]) {
person_t a;
memset(&a, 0, sizeof(person_t));

person_set_name(&a, "Konrad Hoppenstauffer");
person_set_age(&a, 42);

void person_set_name(person_t* person, char* name) {
if(person->name) {
free(person->name);
}
person->name = malloc(sizeof(char) * strlen(name) + 1);
strcpy(person->name, name);
}

上面的效果很好。

使用此功能时出现问题:

person_t* string_to_person(char* str) { 
person_t* person = malloc(sizeof(person_t));

int len = 0;
while(str[len] != '\t') {
len++;
}

char* name = malloc(len + 1);

int i;
for(i = 0; i < len; i++) {
name[i] = str[i];
}
name[len] = '\0';

person_set_name(person, name);
person_set_age(person, atoi(str+len+1));

return person;
}

这里的str类似于:“NameNameson\t22”。这是用制表符分隔的名称。然后我将两者分开并将字符放入 char* name 中。

person_t 是结构体的类型定义。

如果我从 person_set_name 中删除 free(person->name),一切正常。但如果我留下它,名称就会变成垃圾,例如:“É8>”。

我假设复制每个字符的 for 循环中发生了错误。但由于我对 C 的经验有限,我看不出是什么。感谢帮助。

最佳答案

您正在尝试释放垃圾指针。

之后:

person_t* person = malloc(sizeof(person_t));

malloc 不会使用任何特定数据初始化新的内存块,因此您的程序此时必须将 *person 视为包含垃圾(因为它可能包含任何数据)。特别是,person->name(即(*person).name)可能不是NULL

不久之后,此代码运行:

if(person->name) {
free(person->name);
}

-如果person->name不是NULL,那么你就释放它。由于 person->name 并未指向您使用 malloc 分配的内容,因此此时您确实处于 Undefined Behaviour Land™ 中。

一种可能的修复方法是在分配人员后立即设置 person->name = NULL;

关于c - 使用 free() 后字符串变成垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32752093/

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