可能重复:
How to find the sizeof(a pointer pointing to an array)
我正在学习如何在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()
时却不知道。
答案 0 :(得分:24)
在第二种情况下,num
不是数组,是指针。 sizeof
给你指针的大小,在你的平台上似乎是8个字节。
无法知道动态分配的数组的大小,您必须将其保存在其他位置。 sizeof
查看类型,但您无法以任何方式从int[5]
的结果中获取完整的数组类型(具有指定大小的数组类型,如类型malloc
),并且sizeof
参数不能应用于不完整的类型,例如int[]
。
答案 1 :(得分:5)
数组不是指针(在某些情况下会衰减到指针,而不是这里)。
第一个是数组 - 所以sizeof
给出了数组的大小= 40个字节。
第二个是指针(不论它指向多少元素) - sizeof
为您提供sizeof(int*)
。
答案 2 :(得分:2)
第二个大小指的是指针的大小,在你的机器中 - 大概是64位 - 是8个字节。
您无法使用sizeof()
来恢复动态分配的结构的大小,但您可以对静态分配的结构执行此操作。
答案 3 :(得分:1)
如果你想知道你分配的东西的大小,那么你需要自己“记住”,因为你的代码完成了分配。如果您的代码没有完成分配,那么[在标准意义上]无法找出指针指向的内存有多大。你只需要“知道”其他方式。