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



我在循环中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读取的任何数据都将无效。

相关内容

  • 没有找到相关文章