在C中找到malloc()阵列长度



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

我正在学习如何在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()来恢复动态分配的结构的大小,但是您可以为静态分配的结构恢复。

如果您想知道分配的事物的大小,则需要自己"记住",因为您的代码完成了分配。如果您的代码尚未完成分配,那么[从标准意义上]就无法确定指向指向的内存有多大。您只需要"知道"其他方式即可。

最新更新