如何处理指向数组的struct组件,该数组的大小在声明结构之后才会知道?

0 c arrays malloc struct pointers

我有一个带指针组件的结构.指针将指向一个数组,其大小将在声明结构后确定.我将需要malloc内存,然后将其分配给指针.以某种方式通过函数调用传递此指针会导致问题.这是一个重新创建错误的简单示例:

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

typedef struct mystruct mystruct;
struct mystruct{
int dim;
double *dubarr;
double dub;
};

int getarr(int *dim, double *dubarr){
*dim = 2; /* The value of dim is not known until this function is called */
dubarr = malloc(*dim * sizeof(double));
double test;
int i;
for(i=0;i<*dim;i++)
  {
  dubarr[i] = (i+1)*7.0;
  test = dubarr[i];
  printf("dubarr[%i] = %.15e\n", i, test);
  }
return 1;}

int initmystruct(mystruct *data){
getarr(&(data->dim),data->dubarr);
data->dub = (data->dim)*((data->dubarr)[0]);
return 1;}

int main(void){

mystruct data;
initmystruct(&data);
double test;
int i;
for(i=0;i<data.dim;i++)
  {
  test = (data.dubarr)[i];
  printf("dubarr[%i] = %.15e\n", i, test);
  }

/* I would do "free(data.dubarr);" here but it causes a crash */

return 1;}
Run Code Online (Sandbox Code Playgroud)

代码编译时没有警告,但组件data.dubarr不通过函数调用维护它们的值.这是输出:

dubarr[0] = 7.000000000000000e+00
dubarr[1] = 1.400000000000000e+01
dubarr[0] = 2.002400628035951e+176
dubarr[1] = 2.186218092030684e-154
Run Code Online (Sandbox Code Playgroud)

请指出我所有的错误:)

Dav*_*nan 5

C使用pass by value.所以在这里:

int getarr(int *dim, double *dubarr)
Run Code Online (Sandbox Code Playgroud)

函数接收dubarr,指向double,通过值传递的指针.所以,无论在哪个功能分配到dubarr外面都看不到getarr.注意getarr修改的实现dubarr,但调用者不会看到那些修改.

与您如何处理dim,修改的位置形成对比*dim.同样看看getarr代码中的调用:

getarr(&(data->dim), data->dubarr);
Run Code Online (Sandbox Code Playgroud)

观察两个参数如何区别对待.对于第一个参数,您传递变量的地址,第二个参数传递指针的值.

相反,你需要:

int getarr(int *dim, double **dubarr)
Run Code Online (Sandbox Code Playgroud)

然后分配到*dubarr这样:

*dubarr = malloc(...);
Run Code Online (Sandbox Code Playgroud)

并且这样打电话getarr:

getarr(&(data->dim), &(data->dubarr));
Run Code Online (Sandbox Code Playgroud)