可能的重复:
如何找到尺寸(指向数组的指针)
我正在学习如何在C中创建动态数组,但是遇到了一个我不知道的问题。
如果我使用代码:
int num[10];
for (int i = 0; i < 10; i++) {
num[i] = i;
}
printf("sizeof num = %lin 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 = %lin 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 bits-是8个字节。
您不能使用sizeof()
来恢复动态分配的结构的大小,但是您可以为静态分配的结构恢复。
如果您想知道分配的事物的大小,则需要自己"记住",因为您的代码完成了分配。如果您的代码尚未完成分配,那么[从标准意义上]就无法确定指向指向的内存有多大。您只需要"知道"其他方式即可。