我使用typedef 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] = '\0';

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

    return person;
}


此处的str类似于:“ Name Nameson \ t22”。那是用制表符分隔的名称。然后我将两者分开,并将字符放在char *名称中。

person_t是结构的typedef。

如果我从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 Behavior Land™。

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

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

10-11 22:59
查看更多