具有可变大小

时间:2016-12-22 12:23:43

标签: c dynamic struct

我想要一个包含可变大小数组的结构。我希望能够初始化不同大小p的{​​{1}}列表。

由于我是C的新手,这对我来说有点棘手。我尝试了以下方法:

n=[2,4,7]

当我尝试此操作时,我的所有列表#include <stdlib.h> #include <stdio.h> typedef struct{ double **plist; } ParticleList; void sendPar(ParticleList *pl, int *n, int np){ pl -> plist = malloc(sizeof(double*) * np); for(int p=0; p<np; p++){ pl->plist[p] = malloc(sizeof(double) * n[p]); } for(int p=0; p<np; p++){ for(int k=0; k<n[p]; k++){ pl->plist[p][k] = k+1; } } } int main(){ ParticleList pl; int np = 3; int n[np]; n[0] = 2; n[1] = 4; n[2] = 7; sendPar(&pl, n, np); // Listsizes for(int p=0; p<np; p++){ printf("Size of List %d is %lu\n", p, sizeof(pl.plist[p])); } } 都具有相同的大小。我做错了什么?

输出

plist[]

但我希望像

这样的东西
Size of List 0 is 8
Size of List 1 is 8
Size of List 2 is 8

1 个答案:

答案 0 :(得分:1)

要保持已分配的double数组的大小并维护2D数组访问算法,您可以修改ParticleList结构,如下所示:

第1步 - 添加一个int数组来存储个人大小

typedef struct{
    int *pSize;
    double **plist;
} ParticleList;

第2步 - 在sendPar()函数分配期间,分配并初始化pSize数组

void sendPar(ParticleList *pl, int *n, int np){
    pl->plist = malloc(sizeof(double*) * np);
    pl->pSize = malloc(sizeof(int) * np); // allocate the pSize array
    for (int p=0; p<np; p++){
        pl->pSize[p] = n[p]; // initialize the pSize Arry
        pl->plist[p] = malloc(sizeof(double) * n[p]);
    }

    ...
}

第3步 - 从main管理每个具有自己大小的double数组

// Listsizes
for(int p=0; p<np; p++){
    printf("Size of List %d is %lu\n", p, (pl.pSize[p]*sizeof(double))));
}