这是我的代码:
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'
字符。
为什么会发生这种情况?
我错过了什么?
谢谢!
答案 0 :(得分:2)
错误的原因是malloc(sizeof(strlen(name)+1))
表达式。 sizeof运算符计算其操作数类型的大小。 strlen(name) + 1
的类型为int
,其大小为4.因此,无论字符串name
的长度如何,都会分配4个字节的内存。删除sizeof运算符,您的代码应该可以正常工作。