我是C的新手。我很难理解以下两者之间的差异
int N = 16
double (*XX)[2] = malloc(2*N*sizeof(double));
和
int N = 16
double *XX[2] = malloc(2*N*sizeof(double));
如果我写第一个,它就会被编译。但是,第二个是给出以下错误。请解释
error: invalid initializer
编辑:我还想问一下malloc在上面的正确情况下做了什么?
答案 0 :(得分:2)
double (*XX)[2]
是指向具有两个double
元素的数组的指针。
double *XX[2]
是指向具有两个double *
元素的数组的指针。
malloc
用于动态内存分配,例如:
char array_stack[2]; // 2 chars allocated on the stack (no need for free())
char *array_heap = malloc(2 * sizeof(char)); // 2 chars allocated on the heap
// later...
free(array_heap); // heap memory must be freed by user
供参考:
char array_stack[2]; // this is nevertheless a pointer
char *array = array_stack; // this works, because array_stack is a pointer to a char
有关堆栈和堆的更多信息:Stack vs Heap
double *XX[2] = malloc(2*N*sizeof(double));
不起作用,因为它期望两个元素作为初始化器。例如:
double _1, _2;
double *XX[2] = {&_1, &_2};
如果你想用malloc做这个,你需要把它改成指向一个带有双指针的数组的指针:
double **XX = malloc(...);
答案 1 :(得分:1)
在这种情况下
double (*XX)[2]
XX是指向2个双打数组的指针
在这种情况下
double *XX[2]
XX是两个指向双重
的数组编辑: 其他人已经解释了malloc,但是用非专业术语来说:使用malloc,你可以使用malloc在你的计算机上预留一定数量的内存,然后将值存储在你用malloc预留的内存中
答案 2 :(得分:0)
malloc
将返回指向某个内存位置(void*
)的指针。double (*XX)[2]
指向双精度数组的指针 - 没问题:编译器知道如何从void*
投射到double*
。double *XX[2]
是一个双指针数组(我更喜欢这样写double* XX[2]
对我来说,更容易理解我们在谈论 double指针) - 编译器不知道从void*
到双指针数组的转换。答案 3 :(得分:0)
第一种情况下的XX只是一个指向带有两个双元素的数组的指针。所以“sizeof(XX)”只有4个。
第二种情况: XX是一个数组名称,其中包含两个元素,其类型为(double *)。 所以下面的代码就可以了。 double * XX [2]; XX [1] = malloc(20 * sizeof(double));
答案 4 :(得分:0)
第一个定义double (*XX)[2]
定义了一个值,这里是一个指针。单个变量可以由单个值初始化,由= malloc(...)
返回。
第二个(double *XX[2]
)定义一个数组。数组初始化器看起来像= {<init value(s)>}
。