c - 动态数组调整大小混淆双重释放或损坏错误

标签 c arrays dynamic malloc free

目标是创建一个平衡的符号检查器,程序查找这些符号的输入<{[(,然后检查它们是否闭合。每次遇到其中一个,就将其压入堆栈。一旦堆栈满了,就需要分配更多的内存。 我不确定这个错误来自哪里,但我相信它可能来 self 的推送功能。我非常困惑,并到处搜索(查看这里具有类似标题的每个问题并尝试建议的解决方案)以尝试修复它。据我所知,这个错误意味着我试图两次释放某些东西,但我不知道会在哪里发生。我尝试了多种不同的方法来做到这一点,但似乎没有任何效果。请帮忙。

对于如何调整动态数组的大小也有点困惑。进入这个我以为你创建了一个新的 temp* 指向数组内容,使用 malloc 调整了原始大小,这会删除所有内容,然后将保存在 temp 中的内容放回去。我已经看到它以几种不同的方式完成,但不确定哪种方式在什么情况下使用。谢谢。

typedef struct{    //for reference
     char *darr;
     int size;
     int top;
 }
 stack;

void push (stack *s, char tsymbol){
 if (s->top == s->size){   //if stack is full
    char *temp = (char*)malloc(sizeof(char)*s->size);
    temp = s->darr;
    free(s->darr);
    s->darr = temp;
    s->size += 2;    
   }   
s->darr[++(s->top)] = tsymbol;
//s->top = s->top + 1;
}

不同的方法

if (s->top == s->size-1){   //if stack is full
   char *pTemp;
   pTemp = (char*)malloc(sizeof(char)*((s->size)+2));
   int i;
   for (i=0; i<(s->top); i++){
       pTemp[i] = s->darr[i];
   }
   free (s->darr);
   s->darr = pTemp;
 }
   s->darr[s->top] = tsymbol;
   s->top = s->top + 1;
}

最佳答案

您的代码存在以下问题:

  1. 在使用当前大小进行分配后,您将增加大小
  2. 您没有将旧数组的内容复制到新数组。
  3. 在调用 malloc() 后分配 temp = s->darr;,因此您会丢失指向新内存的指针。
  4. 稍后,您可以在 free(s->darr) 之后分配 s->darr = temp;。但由于 #3,temps->darr 相同,所以这不会执行任何操作,现在 s->darr > 仍然指向已释放的内存。下次调用 push() 时,您将再次释放它,这会导致双重释放错误。
  5. 您分配给s[++(s->top)]。但由于您在分配之前没有增加大小,因此会在数组外部进行分配。
  6. s->top == s->size-1时,您需要增大数组。这是因为数组索引从 0size-1;分配给 s->darr[s->size] 将写入越界。为了额外的安全性,请使用 >= 而不是 ==
  7. 将新项目存储到 s->darr 时应使用后增量。通过预增量,您可以跳过数组的第一个元素,并且还可以写入数组之外的内容,除非增长测试使用 s->size-2

这是更正后的版本。

void push (stack *s, char tsymbol){
    if (s->top >= s->size - 1){   //if stack is full
        char *temp = alloc(s->size + 2);
        memcpy(temp, s->darr, s->size);
        s->darr = temp;
        s->size += 2;    
    }   
    s->darr[(s->top)++] = tsymbol;
}

另请参阅Do I cast the result of malloc?

关于c - 动态数组调整大小混淆双重释放或损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54701827/

相关文章:

c - 是否有工具可以列出 C 函数使用和输出的全局变量?

c - 读取器进程在 FIFO 文件关闭时终止

c - C 中的浮点异常(核心转储)

c - fwrite 只写入第一个元素并删除所有后续元素

c - 如何在C中从STDOUT读取直到EOF?

asp.net-mvc - MVC 动态 View 数据和动态 View

c - 为什么用户的输入会在终端上回显?

JavaScript 拼接并放入另一个数组

c - 在数组上使用 malloc

mysql - Highcharts动态更新饼图mysql