我想要一个包含可变大小数组的结构。我希望能够初始化不同大小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
答案 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))));
}