C-使用指针将指针用于`double'时,为什么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 = %lun",sizeof(E)/sizeof(E[0])); //checking size of array E

无论N的实际值如何

我知道这似乎很基本,但是我不明白为什么这会起作用。

任何见解都将不胜感激。

您本质上是将指针的大小除以双重大小。两者都采用相同数量的字节(通常为8个)存储。因此,您得到1。

e的类型是双重指针。E的价值是一个地址。当您获得尺寸(e)时,您将获得变量的大小,即指针的大小,而不是变量指向的大小。为了获得分配的Malloc的大小,您需要在大小上放置指针,以便您的最后一行变为:

printf("size of E = %lun",sizeof(*E) * N/sizeof(E[0]));

编辑

*e和e [0]之间没有差异,如其中一条评论所指出的那样。在C中,您无法知道数组在哪里结束,因为数组本身作为数据类型不会存储其长度。这就是为什么需要C 中的向量数据类型的部分原因。

另外,由于您已经将数组的长度存储在n中,因此您也可能只打印N。当您将数组传递到任何功能时,请与长度一起传递数组。使用字符串,您可以在字符数组中迭代到" 0"(无效终止字符)。对于整数和浮点数据类型数组,没有这样的约定。

malloc正在分配正确的大小数组,否则您的测试是错误的。

sizeof(e)是指针的大小= 8

sizeof(*e)是第一个double = 8

的大小

您可以知道数组大小的大小( * e) * n

如果sizeof(E)按照您的预期工作(给出分配的内存的大小,而不是指针的大小),则在此解释上进行另一种旋转动态分配阵列的大小。您不能在c。

中这样做

相关内容

  • 没有找到相关文章

最新更新