指针赋值后

时间:2018-02-08 16:28:42

标签: c pointers memory struct

我试图为结构分配内存并初始化结构。

在一个函数中,它接受一个指向struct和其他一些参数的指针(在其他成员中使用),我为struct本身及其nodes成员分配内存并初始化其他成员。在初始化函数中打印sizelen成员会输出正确的值,但在函数输出随机垃圾后对其进行测试。

为什么会出现这种情况,我该怎么做才能修复它?

结构定义:

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

1 个答案:

答案 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。

不需要投射mallocrealloc的结果。完成使用后释放分配的内存。检查mallocrealloc的返回值。

struct node_t* temp= realloc((*q)->nodes,init_size*sizeof(struct node_t)));
if( temp == NULL ){
   perror("realloc");
   exit(EXIT_FAILURE);
}
(*q)->nodes = temp;