C,Malloc()和数组长度

可能重复:
如何找到sizeof(指向数组的指针)

我正在学习如何在C中创建动态数组,但遇到了一个我无法弄清楚的问题。

如果我使用代码:

int num[10]; for (int i = 0; i < 10; i++) { num[i] = i; } printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

我得到输出:

 sizeof num = 40 sizeof num[0] = 4 

这就是我期望发生的事情。 但是,如果我malloc数组的大小如下:

 int *num; num = malloc(10 * sizeof(int)); for (int i = 0; i < 10; i++) { num[i] = i; } printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

然后我得到输出:

 sizeof num = 8 sizeof num[0] = 4 

我很想知道为什么当我使用固定长度方法时数组的大小是40,但是当我使用malloc()时却不知道。

在第二种情况下, num不是数组,是指针。 sizeof为您提供指针的大小,在您的平台上似乎是8个字节。

无法知道动态分配的数组的大小,您必须将其保存在其他位置。 sizeof查看类型,但是无法以任何方式从malloc的结果中获取完整的数组类型(具有指定大小的数组类型,如int[5]类型),并且sizeof参数不能应用于一个不完整的类型,如int[]

数组不是指针(在某些情况下衰减到指针,而不是这里)。

第一个是数组 – 所以sizeof给你的数组大小= 40个字节。

第二个是指针(不管它指向多少元素) – sizeof给你sizeof(int*)

第二个大小是指指针的大小,在你的机器中 – 大概是64位 – 是8个字节。

您不能使用sizeof()来恢复动态分配的结构的大小,但您可以对静态分配的结构执行此操作。

如果你想知道你分配的东西的大小,那么你需要自己“记住”,因为你的代码完成了分配。 如果你的代码没有完成分配,那么[在标准意义上]没有办法找出指针所指向的内存有多大。 你只需要“知道”其他方式。