错误 - 00352D10处的堆块在00352D1C处修改,超过请求的大小4

时间:2015-05-19 21:28:53

标签: c

这是我的代码:

struct etf_t{
    int id;
    char* name;
    List CompanyList;
    Map CompanyPercentage;
};

Etf EtfCreate(int id, char* name)
{
    if(name==NULL) return NULL;
    Etf etf=malloc(sizeof(*etf));
    if(etf==NULL) return NULL;
    etf->id=id;
    etf->name=malloc(sizeof(strlen(name)+1));
    if(etf->name==NULL) return NULL;
    strcpy(etf->name,name);
    etf->CompanyList=NULL;
    etf->CompanyPercentage=NULL;
    return etf;
}

void EtfFree (Etf etf)
{
    if(!etf) return;
    if(etf->name!=NULL) free(etf->name);
    mapDestroy(etf->CompanyPercentage);
    listDestroy(etf->CompanyList);
    free(etf);
}

或至少其中一些,现在使用以下简单代码进行测试:

bool testetfcreate()
{
    Etf fail= EtfCreate(1, NULL);
    ASSERT_TEST(fail==NULL);
    Etf new = EtfCreate(1,"first");
    ASSERT_TEST(new!=NULL);
    EtfFree(new);
    return true;
}

我在行free(etf->name)中得到了给定的错误; {在EtfFree函数中。}

错误 - 00352D10处的阻止阻止在00352D1C过去请求的大小为4时修改

现在我知道这个错误的来源通常是我试图写入我尚未分配的内存,但是我没有看到它发生在这里因为我分配了strlen+1 我应该拥有名称字符串的所有空间和最后的'\0'字符。

为什么会发生这种情况?

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

错误的原因是malloc(sizeof(strlen(name)+1))表达式。 sizeof运算符计算其操作数类型的大小。 strlen(name) + 1的类型为int,其大小为4.因此,无论字符串name的长度如何,都会分配4个字节的内存。删除sizeof运算符,您的代码应该可以正常工作。