C 释放二维动态数组时堆损坏
我有一个简单的程序来填充2D动态字符数组。分配工作照常进行。我的问题在于释放数组。我在VC++2008上使用纯C 这是我分配和初始化数组时的一段代码:C 释放二维动态数组时堆损坏,c,arrays,malloc,free,C,Arrays,Malloc,Free,我有一个简单的程序来填充2D动态字符数组。分配工作照常进行。我的问题在于释放数组。我在VC++2008上使用纯C 这是我分配和初始化数组时的一段代码: char** messsages = (char**)malloc(5*sizeof(char*)); initValorArrayMsgs(messsages, 5); insertMsgToArray(5, messsages , "Test message."); void insertMsgToArray(int totalLines
char** messsages = (char**)malloc(5*sizeof(char*));
initValorArrayMsgs(messsages, 5);
insertMsgToArray(5, messsages , "Test message.");
void insertMsgToArray(int totalLines, char** msgsArray, const char* msgToInsert)
{
int line = 0;
int size= strlen(msgToInsert);
for(; line < totalLines; line ++)
{
if(strlen(msgsArray[line ]) == 0)
{
msgsArray[line ] = (char*)malloc(sizeof(char) * size);
strcpy(msgsArray[line], msgToInsert);
break;
}
}
}
char**messages=(char**)malloc(5*sizeof(char*);
initValorArrayMsgs(消息,5);
insertMsgToArray(5,消息,“测试消息”);
void insertMsgToArray(整型合计,字符**MsgArray,常量字符*msgToInsert)
{
内线=0;
int size=strlen(msgToInsert);
对于(;行
这是我释放数组的代码
void freeArrayMsgs(char** arry, int lines)
{
int i = 0;
for(; i < lines; i++)
{
if(strlen(arry[i]) == 0){
break;
}
free(arry[i]);
}
free(arry);
}
void freerarymsgs(字符**arry,int行)
{
int i=0;
对于(;i<行;i++)
{
if(strlen(arry[i])==0){
打破
}
自由(arry[i]);
}
免费(arry);
}
当程序尝试释放第一个数组时,会引发堆损坏异常
阅读了一些关于SO的帖子,我正确地释放了我的数组。那么,为什么我会得到hep腐败例外?有几件事:
- 您需要
来安装空终止符malloc(大小+1)
- 无需执行
-sizeof(char)
是根据sizeof
定义的,因此始终为1char
- 您不应该强制转换malloc的结果-这是不必要的,可能会隐藏问题
- 由于未初始化
,因此无法保证msgsArray
。事实上,它可能不会。如果希望这是真的,请使用strlen(msgsArray[line])==0
而不是calloc
malloc
- 一般来说,使用strncpy而不是strcpy更安全
- 与其使用
,不如将strlen
s初始化为char*
并检查null
。如果第一个null
是空字符串,而其余的是实字符串,该怎么办?您的代码将退出循环,因为msgToInsert
,而检查strlen(msgs[0])==0
将修复此问题null
的内部逻辑似乎可疑:在第一个空指针上,它停止循环freeArrayMsgs
for ( ; i < lines; i++) { if (strlen (arry[i]) == 0) break; free (arry[i]); }
- 有两件事突然向我袭来:
msgsArray[line]=(char*)malloc(sizeof(char)*size)
需要使用(size+1)
而不是size
来容纳字符串的空终止符。作为补充说明,为什么不将循环初始值设定项放在for
循环中?例如,For(i=0;i
而不是执行i=0
单独执行(;ifor ( ; i < lines; i++)
{
free (arry[i]);
arry[i] = NULL;
}