gpt4 book ai didi

C Memory free in loop error -> 大小为 1 的无效读取

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:54 25 4
gpt4 key购买 nike

我在循环中使用 mallocchar 指针的 free() 有问题。

char *x=malloc(30) 中,我存储了一个字符串,我正在使用 add(x,queue) 将其推送到堆栈。问题是我每次迭代都在malloc 中调用它,所以我需要在每次迭代中free 它,否则我会在 valgrind 中发生内存泄漏。但是,如果我将 free(x); 放在 while 循环的末尾,valgrind 会遇到 strcmp 的问题:

Invalid read of size 1
at 0x403045D: strcmp

by 0x048871: main(main.c 149) = else if(!strcmp(x,l))
address is 0 bytes inside block of size 30 free d

by 0x80488b8: main(main.c 164) = free(x);
block was allocked at
at 0x402c17c:malloc by main(main.c 129) =char *x=malloc(30);

这很奇怪,因为在下一次分配之前我不需要那个char *x。有没有办法以不同的方式分配它?

while ((a = getchar()) != EOF) {
if (a == '<'){
act = 1;
}
if (act == 1) {
char *x=malloc(30);
scanf("%29[^>]s",x);

if(*x=='/'){

void *l;
l=pop_from_queue(queue);

if(l==NULL)
valid=1;
else if(!strcmp(x+1,l))
valid=0;
else
valid=1;

act=0;
}else{
push_to_queue(queue,x); //push to stack
count++;
act=0;

}
free(x);
}
}

初始化堆栈:

typedef struct {
void **data;
int head;
int size;
int count;

} queue_t;

queue_t* create_queue(int capacity){
queue_t *queue=calloc(sizeof(queue_t),sizeof(queue_t));
queue->head=0;
queue->data=calloc(capacity+10,sizeof(void*));
queue->count=0;
queue->size=capacity+1;
return queue;
}

弹出函数:

void* pop_from_queue(queue_t *queue){

if(queue->count==0)
return NULL;
else
queue->count--;

if(queue->head<0)
return NULL;

if(queue->head!=0)
queue->head--;

return queue->data[queue->head];

}

推送功能:

bool push_to_queue(queue_t *queue, void *data){
if(queue->count==queue->size){
queue->size+=10;
queue->data=realloc(queue->data,queue->size*sizeof(void*));
}
queue->data[queue->head++]=data;
queue->count++;

return true;
}

最佳答案

push_to_queue(queue,x); 之后你不能执行 free(x);,你必须 free(x); 仅当 if(*x=='/')

因为你释放了压入的值,当你弹出它时你得到了一个已经空闲的内存,并且那个内存被 strcmp 使用了

这么简单我以前没看到!

注意:无论 strcmp 的结果如何,如果不是 NULL,您需要释放通过 pop 获得的值

关于C Memory free in loop error -> 大小为 1 的无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54042121/

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