我试图为结构分配内存并初始化结构。
在一个函数中,它接受一个指向struct和其他一些参数的指针(在其他成员中使用),我为struct本身及其nodes
成员分配内存并初始化其他成员。在初始化函数中打印size
和len
成员会输出正确的值,但在函数输出随机垃圾后对其进行测试。
为什么会出现这种情况,我该怎么做才能修复它?
结构定义:
struct node_t {
int priority;
void *data;
};
struct pqueue {
int len,size,chunk_size;
struct node_t *nodes;
};
初始化功能:
int alloc_pq(struct pqueue *q,int init_size,int chunk_size){
// allocate for struct
if((q=(struct pqueue*) malloc(sizeof(struct pqueue)))==NULL){
perror("malloc");
return -1;
}
// set initial sizes
q->len=0;
q->chunk_size=chunk_size;
q->size=init_size;
if(init_size>0){
// allocate initial node memory (tried malloc here too)
if((q->nodes=(struct node_t*) realloc(q->nodes,init_size*sizeof(struct node_t)))==NULL){
perror("realloc");
return -1;
}
}
printf("%lu %d %d\n",sizeof(*q),q->size,q->len); // DEBUG
return q->size;
}
在主要功能中:
struct pqueue q;
...
alloc_pq(&q,n,0);
printf("%lu %d %d\n",sizeof(q),q.size,q.len); // DEBUG
输出(倒数第二个数字始终> 32000,最后看似随机):
24 67 0
24 32710 -2085759307
答案 0 :(得分:1)
你做事的方式是不做任何改变。你传递了地址,然后覆盖了它。
当该功能结束时,您对q
所做的任何更改都将丢失。解决方案是在main()
中取一个指针变量并传递它的地址。
struct pqueue* q;
...
alloc_pq(&q,n,0);
相应地更改alloc_pq
。像
int alloc_pq(struct pqueue **q,int init_size,int chunk_size){
// allocate for struct
if((*q=malloc(sizeof(struct pqueue)))==NULL){
perror("malloc");
return -1;
}
// set initial sizes
(*q)->len=0;
(*q)->chunk_size=chunk_size;
(*q)->size=init_size;
if(init_size>0){
// allocate initial node memory (tried malloc here too)
if(((*q)->nodes= realloc((*q)->nodes,init_size*sizeof(struct node_t)))==NULL){
perror("realloc");
return -1;
}
}
printf("%lu %d %d\n",sizeof(*q),(*q)->size,(*q)->len); // DEBUG
return (*q)->size;
}
您使用realloc
是错误的。使用临时vcariable来保存结果并检查它是否返回NULL。
不需要投射malloc
,realloc
的结果。完成使用后释放分配的内存。检查malloc
,realloc
的返回值。
struct node_t* temp= realloc((*q)->nodes,init_size*sizeof(struct node_t)));
if( temp == NULL ){
perror("realloc");
exit(EXIT_FAILURE);
}
(*q)->nodes = temp;