我在循环中free()
malloc
char
指针时遇到问题。
在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的结果如何,您都需要释放通过pop获得的值,如果不是NULL。
在取消引用之前,您不会验证scanf()
是否实际处理了任何数据x
。
如果scanf()
不读取任何数据并将其存储在x
中,则从x
读取的任何数据都将无效。