DSI技术组 2022-01-24 10:29 采纳率: 100%
浏览 208
已结题

探究realloc用法,realloc函数对同一个地址重复操作会返回NULL!

一、在程序设计中,某次意外操作realloc操作同一个地址,造成了其返回NULL异常。
realloc传入的指针与pCommandTemp指针所赋值不一致,在第三次realloc时必出现异常,
重启10次,现象稳定。

for(StopActionChild=mxmlFindElement(AutoChild,tree,"command",NULL,NULL,MXML_DESCEND);
                        StopActionChild!=NULL;
                        StopActionChild=StopActionChild->next->next)
                    {
                        pCommandTemp = (CommandInfo_t *)realloc((m_ProcInfos + m_ProcInfoNum)->ProcStopActions,sizeof(CommandInfo_t)*(CommandNum+1));
                        if(!pCommandTemp)
                        {
                            LOG_ERR("[appAutoProcLoadConfig-->realloc] pCommandTemp realloc error.\n");
                            free(m_ProcInfos);
                            m_ProcInfos=NULL;
                            mxmlDelete(tree);                                /*删除xml文件句柄*/
                            fclose(fp);                                        /*关闭文件*/    
                            return -1;
                        }
                        (m_ProcInfos+m_ProcInfoNum)->JudgeParamInfos->StopCommands = pCommandTemp;
                        memcpy(((m_ProcInfos+m_ProcInfoNum)->JudgeParamInfos->StopCommands+CommandNum)->Name, mxmlElementGetAttr(StopActionChild,"name"),30);
                        memcpy(((m_ProcInfos+m_ProcInfoNum)->JudgeParamInfos->StopCommands+CommandNum)->Type, mxmlElementGetAttr(StopActionChild,"type"),30);
                        ((m_ProcInfos+m_ProcInfoNum)->JudgeParamInfos->StopCommands+CommandNum)->Tab = atoi(mxmlElementGetAttr(StopActionChild,"tab"));
                        ((m_ProcInfos+m_ProcInfoNum)->JudgeParamInfos->StopCommands+CommandNum)->Code = atoi(mxmlElementGetAttr(StopActionChild,"code"));
                        CommandNum++;/*停止动作计数递增*/
                    }
                    (m_ProcInfos+m_ProcInfoNum)->JudgeParamInfos->StopCmdNum = CommandNum;

调试结果:

img

二、编写独立realloc测试程序,首先malloc一个commad结构体,然后重复用commad地址realloc,会在第三个循环出现异常,重启10次,故障现象稳定。

void exam_01()
{
       CommandInfo_t * pCommandTemp=NULL;
       CommandInfo_t *  command=(CommandInfo_t *  )malloc(sizeof(CommandInfo_t *));
       int i;
       for(i=0;i<100;i++)
        {
              pCommandTemp=(CommandInfo_t *)realloc(command,sizeof(CommandInfo_t )*(i+1));
              LOG_WARN("\n<>realloc test: < pCommandTemp:0x%x,m_ProcInfoNum:%d,CommandNum:%d>
              \n",pCommandTemp,0,i);
             if(!pCommandTemp)
              {
                        LOG_ERR("pCommandTemp realloc error.\n");
                        return;
              }
        }
}

调试结果:

img

关于realloc对同一个地址重复操作会出现返回NULL结果疑问,目前寻找资料未能找到合理解释,该种现象的原理?

  • 写回答

3条回答 默认 最新

  • 不会写代码的猴子 Android领域优质创作者 2022-01-24 11:11
    关注

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 创建了问题 1月24日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改