使用 free() 后字符串变成垃圾
String turns to garbage after using free()
我用 typedef 在 person 结构中创建了一个 person person_t:
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] = '[=11=]';
person_set_name(person, name);
person_set_age(person, atoi(str+len+1));
return person;
}
这里的 str 类似于:"Name Nameson\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
分配的内容,此时您已经真正进入了未定义行为领域™。
一种可能的解决方法是在分配人员后立即设置 person->name = NULL;
。
我用 typedef 在 person 结构中创建了一个 person person_t:
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] = '[=11=]';
person_set_name(person, name);
person_set_age(person, atoi(str+len+1));
return person;
}
这里的 str 类似于:"Name Nameson\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
分配的内容,此时您已经真正进入了未定义行为领域™。
一种可能的解决方法是在分配人员后立即设置 person->name = NULL;
。