为什么malloc()在使用指向`double`的指针时没有分配正确的内存大小?

时间:2016-06-19 21:54:27

标签: c pointers malloc

以下是我要做的事情的本质:

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()函数没有在内存中分配正确的大小?

我知道这似乎很简陋,但我不明白为什么这不起作用。

非常感谢任何见解。

4 个答案:

答案 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语言做到这一点。