【发布时间】:2013-09-02 02:36:33
【问题描述】:
我有一个简单的程序来填充二维动态字符数组。分配照常进行。我的问题依赖于释放数组。我在 VC++ 2008 上使用纯 C。
这是我分配和初始化数组时的一段代码:
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;
}
}
}
这是我释放数组的代码
void freeArrayMsgs(char** arry, int lines)
{
int i = 0;
for(; i < lines; i++)
{
if(strlen(arry[i]) == 0){
break;
}
free(arry[i]);
}
free(arry);
}
当程序尝试释放第一个数组时,会引发堆损坏异常。
阅读一些关于 SO 的帖子,我正确地释放了我的数组。那么,为什么我会收到 hep 损坏异常?
【问题讨论】:
-
msgsArray[line ] = (char*)malloc(sizeof(char) * size);需要有(size+1)而不是size以容纳字符串的空终止符。附带说明一下,为什么不将循环初始化程序放在for循环中呢?比如for ( i = 0; i < lines; i++ )而不是单独做i = 0;和做for ( ; i < lines; i++ )? -
和上面的bug一样,注意不要把malloc的结果转换成C语言。
-
@learner:见stackoverflow.com/questions/605845/…
-
大家的回复很有帮助。
-
@PaulR 非常有趣的资源。