gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:30:13 24 4
gpt4 key购买 nike

目标是创建一个平衡的符号检查器,程序查找这些符号的输入<{[(,然后检查它们是否闭合。每次遇到其中一个,就将其压入堆栈。一旦堆栈满了,就需要分配更多的内存。我不确定这个错误来自哪里,但我相信它可能来 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/

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