我在循环中遇到free()
的{{1}}指针的malloc
。
在char
中,我存储了要用char *x=malloc(30)
推入堆栈的字符串。问题是我在每次迭代中都add(x,queue)
对其进行操作,因此我需要在每次迭代中malloc
对其进行操作,否则在valgrind中会发生内存泄漏。但是,如果我将free
放在while循环的末尾,则valgrind会遇到free(x);
的问题:
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];
}
答案 0 :(得分:0)
在取消引用scanf()
之前,您不验证x
确实处理了任何数据。
如果scanf()
不读取任何数据并将其存储在x
中,则从x
进行的任何读取都是无效的。
答案 1 :(得分:0)
您不得在free(x);
之后再做push_to_queue(queue,x);
,只有在free(x);
时才必须if(*x=='/')
因为您释放了推入的值,当您弹出它时,您已经获得了一个可用的内存,并且该内存已被 strcmp
使用这么简单,我以前没看过!
注意:无论 strcmp
的结果如何,如果不为NULL,则需要释放通过弹出窗口获取的值