C,Malloc()和数组长度

GCB*_*son 16 c arrays 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]));
Run Code Online (Sandbox Code Playgroud)

我得到输出:

sizeof num = 40
sizeof num[0] = 4
Run Code Online (Sandbox Code Playgroud)

这就是我期望发生的事情.但是,如果我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]));
Run Code Online (Sandbox Code Playgroud)

然后我得到输出:

sizeof num = 8
sizeof num[0] = 4
Run Code Online (Sandbox Code Playgroud)

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

eff*_*ffe 27

在第二种情况下,num不是数组,是指针.sizeof给你指针的大小,你的平台上似乎是8个字节.

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


Luc*_*ore 5

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

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

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