C内存释放循环错误->大小为1的无效读取

时间:2019-01-04 15:46:33

标签: c memory stack malloc

我在循环中遇到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];

}

2 个答案:

答案 0 :(得分:0)

在取消引用scanf()之前,您不验证x确实处理了任何数据。

如果scanf()不读取任何数据并将其存储在x中,则从x进行的任何读取都是无效的。

答案 1 :(得分:0)

您不得在free(x);之后再做push_to_queue(queue,x);,只有在free(x);时才必须if(*x=='/')

因为您释放了推入的值,当您弹出它时,您已经获得了一个可用的内存,并且该内存已被 strcmp

使用

这么简单,我以前没看过!

注意:无论 strcmp

的结果如何,如果不为NULL,则需要释放通过弹出窗口获取的值