Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 释放二维动态数组时堆损坏_C_Arrays_Malloc_Free - Fatal编程技术网

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

我有一个简单的程序来填充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;
        }
    }
}
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
    是根据
    char
    定义的,因此始终为1
  • 您不应该强制转换malloc的结果-这是不必要的,可能会隐藏问题
  • 由于未初始化
    msgsArray
    ,因此无法保证
    strlen(msgsArray[line])==0
    。事实上,它可能不会。如果希望这是真的,请使用
    calloc
    而不是
    malloc
  • 一般来说,使用strncpy而不是strcpy更安全
  • 与其使用
    strlen
    ,不如将
    char*
    s初始化为
    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
      单独执行(;i?以及上面的错误,请注意不要在C中使用malloc的结果。@learner:各位,你们的回答非常有用。@PaulR非常有趣的资源。从一个快速播放中,它似乎不喜欢列表元素中的代码格式-我删除了你们的1。二,。代码格式化开始工作。@wallyk您只需要添加更多缩进。@MarkHurd我插入了break,因为除了分配的内存外,我不想删除任何内容。A好的,我忘了在那之后加空。但问题仍然存在。我只是纠正了缩进以使格式看起来正确。您可能希望在此处向其他人@comment。已解决,堆损坏正在发生,因为我缺少适合空终止符的文件。直截了当,马特。
      for ( ;  i < lines;  i++)  
      {  
          free (arry[i]);  
          arry[i] = NULL;  
      }