目标是创建一个平衡的符号检查器,程序查找这些符号的输入<{[(,然后检查它们是否闭合。每次遇到其中一个,就将其压入堆栈。一旦堆栈满了,就需要分配更多的内存。 我不确定这个错误来自哪里,但我相信它可能来 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;
}
最佳答案
您的代码存在以下问题:
- 在使用当前大小进行分配后,您将增加
大小
。 - 您没有将旧数组的内容复制到新数组。
- 在调用
malloc()
后分配temp = s->darr;
,因此您会丢失指向新内存的指针。 - 稍后,您可以在
free(s->darr)
之后分配s->darr = temp;
。但由于 #3,temp
与s->darr
相同,所以这不会执行任何操作,现在s->darr
> 仍然指向已释放的内存。下次调用push()
时,您将再次释放它,这会导致双重释放错误。 - 您分配给
s[++(s->top)]
。但由于您在分配之前没有增加大小,因此会在数组外部进行分配。 - 当
s->top == s->size-1
时,您需要增大数组。这是因为数组索引从0
到size-1
;分配给s->darr[s->size]
将写入越界。为了额外的安全性,请使用>=
而不是==
。 - 将新项目存储到
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;
}
关于c - 动态数组调整大小混淆双重释放或损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54701827/