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)
请指出我所有的错误:)
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)