结构指针空闲导致错误

时间:2016-03-04 22:20:15

标签: c pointers struct free

我有以下结构:

typedef struct {
    char* type;
    char* address;
    int area, price;
}Offer;

和这两个功能:

Offer* initOffer(char* type, char* address, int area, int price)
{
    Offer* p;
    p = (Offer*)malloc(sizeof(Offer));
    p->type = (char*)malloc(sizeof(type));
    p->address = (char*)malloc(sizeof(address));
    strcpy(p->type, type);
    strcpy(p->address, address);
    p->area = area;
    p->price = price;
    return p;
}

void destroyOffer(Offer* offer)
{
    free(offer->type);
    free(offer->address);
    free(offer);
}

当我调用destroyOffer时出现问题,我不知道为什么,但是当我运行代码时,我有一个错误说:HEAP CORRUPTION DETECTED。如果我删除这两行,它工作正常,但我认为内存未正确清理:

free(offer->type);
free(offer->address);

1 个答案:

答案 0 :(得分:0)

问题:

p->type = (char*)malloc(sizeof(type));   // That's just the size of a pointer
p->address = (char*)malloc(sizeof(address)); // Same problem.

之后,行:

strcpy(p->type, type);
strcpy(p->address, address);

最终写出他们不应该写的内存。这导致了未定义的行为。

你需要:

p->type = malloc(strlen(type)+1);
p->address = malloc(strlen(address)+1);

请参阅Do I cast the result of malloc?

如果编译器支持strdup,也可以使用p->type = strdup(type); p->address = strdup(address); 。如果是这样,您的代码可以简化为:

mfcol