gpt4 book ai didi

c - 释放二维动态数组时堆损坏

转载 作者:行者123 更新时间:2023-12-04 04:43:43 24 4
gpt4 key购买 nike

我有一个简单的程序来填充 2D 动态字符数组。分配照常工作。我的问题依赖于释放数组。我在 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 腐败异常?

最佳答案

一些事情:

  • 您需要malloc(size + 1)以适应空终止符。
  • 没有必要做sizeof(char) - sizeof根据 char 定义,所以总是 1。
  • 你不应该转换 malloc 的结果- 这是不必要的,可能会隐藏问题。
  • msgsArray未初始化,无法保证strlen(msgsArray[line]) == 0 .事实上,它可能不会。使用 calloc而不是 malloc如果你希望这是真的。
  • 一般情况下,使用 strncpy而不是 strcpy - 更安全。
  • 而不是使用 strlen ,最好初始化 char*转至 null并检查 null .如果第一个怎么办 msgToInsert是一个空字符串,但其余的都是真正的字符串?您的代码将退出循环,因为 strlen(msgs[0]) == 0 ,其中检查 null相反会修复。
  • 关于c - 释放二维动态数组时堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18514703/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com