如果在循环的每次迭代中再次使用相同的变量名称,malloc 是否会在同一位置分配内存?

问题描述 投票:0回答:1

我正在编写代码来接受c中的加权邻接表。每条边都以结构体的形式存储。我创建了一个指针数组,其中每个指针都指向一个节点的列表。这就是我所做的:

#include<stdio.h>
#include<stdlib.h>

struct edge{
    int u;
    int v;
    int w;
};

// taking a weighted adjacency list 
int main(){
int n; // number of nodes
scanf("%d ",&n);
struct edge** list[n];
int p=n;
while(p){
    struct edge* n_list=(struct edge*)malloc(n*sizeof(struct edge));
    int num=1;
    for(int i=0;i<n;i++){
        n_list[i].u=n-p;
        scanf("%d ",&n_list[i].v);
        if(n_list[i].v==-1) {
            n_list[i].w=-1;
            break;
        }
        else{
                num++;
                scanf("%d ",&n_list[i].w);
            }
    }
    
    n_list=(struct edge*)realloc(n_list,num*sizeof(struct edge));
    list[n-p]=&n_list;
    struct edge* ptr=*list[n-p];
    for(int j=0;j<num-1;j++){
        printf("%d %d %d\n",ptr[j].u,ptr[j].v,ptr[j].w);

    }

    p--;
}

}

问题是边被正确打印,但在 p(节点数)上的整个迭代之后,指针数组(列表)中的每个元素都存储了相同的地址。我猜测每次我对 n_list 使用 malloc 时,它都会在同一位置分配内存,从而在我开始接受输入时擦除前一个节点的列表。我怎样才能确保这种情况不会发生?也欢迎使用任何更简单的方法来完成此任务。

c struct malloc dynamic-memory-allocation adjacency-list
1个回答
0
投票

这就是你的问题

    list[n-p]=&n_list;
    //        ^ address of

这会将

n_list
的地址放入
list[n-p]
中。这将是堆栈上的地址 -
n_list
的位置。

list
的元素属于
struct edge**
类型,但您将
struct edge*
类型的项目放入其中。你的间接性太多了。幸运的是,您还取消引用指针以在迭代结束之前进行打印,并且
n_list
会在下一次进行 malloc。

    struct edge* ptr=*list[n-p];
    //               ^ dereference

要解决此问题,请按如下方式声明

list

struct edge** list[n];

并删除“地址”/取消引用

    list[n-p] = n_list;
    struct edge* ptr = list[n-p];
© www.soinside.com 2019 - 2024. All rights reserved.