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()
来恢复动态分配的结构的大小,但您可以对静态分配的结构执行此操作。
如果你想知道你分配的东西的大小,那么你需要自己“记住”,因为你的代码完成了分配。 如果你的代码没有完成分配,那么[在标准意义上]没有办法找出指针所指向的内存有多大。 你只需要“知道”其他方式。