以下是我要做的事情的本质:
double *E; //Array of doubles
int N; //The eventual size of the array, typically >1
// some code where variable N gets assigned
//inside of some function
E = malloc(sizeof(double)*N);
printf("size of E = %lu\n",sizeof(E)/sizeof(E[0])); //checking size of array E
此代码的输出是"大小为E = 1",无论N的实际值如何。为什么malloc()函数没有在内存中分配正确的大小?
我知道这似乎很简陋,但我不明白为什么这不起作用。
非常感谢任何见解。
答案 0 :(得分:2)
您实际上是将指针的大小除以double的大小。两者都采用相同数量的字节(通常为8个)来存储。因此你得到1。
答案 1 :(得分:1)
E的类型是指向double的指针。 E的值是一个地址。当你得到sizeof(E)时,你得到的是指针变量的大小,而不是变量指向的大小。为了获得malloc分配的大小,你需要在sizeof中取消引用指针,这样你的最后一行就变成了:
printf("size of E = %lu\n",sizeof(*E) * N/sizeof(E[0]));
修改强>
正如其中一条评论所指出的,* E和E [0]之间没有区别。在C中,您无法知道数组的结束位置,因为数组本身作为数据类型不会存储其长度。这就是为什么C ++中的vector数据类型是必要的原因。
此外,由于您已经将数组的长度存储在N中,因此您也可以只打印N.当您将数组传递给任何函数时,将数组与长度一起传递。使用字符串,您可以在字符数组上进行迭代,直到得到空终止字符“0”。对于整数和浮点数据类型数组,没有这样的约定。
答案 2 :(得分:0)
malloc正在分配一个正确大小的数组,否则你的测试是错误的。
sizeof(E)是指针的大小= 8
sizeof(* E)是第一个双倍的大小= 8
您可以知道数组的大小乘以sizeof(* E)* N
答案 3 :(得分:0)
如果sizeof(E)
按预期工作(给出分配的内存的大小,而不是指针的大小),那么你可以使用它来获得动态分配的大小阵列。你不能用C语言做到这一点。