C,malloc()和阵列长度[重复](C, Malloc() and array length [

2019-07-17 12:25发布

可能重复:
如何找到的sizeof(一个指针指向数组)

我正在学习如何创造下的动态数组,但所遇到的一个问题,我想不通。

如果我使用的代码:

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()

Answer 1:

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

有没有办法知道一个动态分配的数组的大小,你必须将它保存在其他地方。 sizeof着眼于类型,但不能获得完整的阵列型(数组类型与指定的大小,种类等的int[5]从结果malloc以任何方式,和sizeof参数不能被应用到一个不完整的类型,像int[]



Answer 2:

数组不是指针(衰减的指针在某些情况下,不是在这里)。

第一个是一个数组-这样sizeof给你阵列= 40个字节的大小。

第二个是一个指针(无论它指向了多少元素) - sizeof给你sizeof(int*)



Answer 3:

第二尺寸指的是指针的大小,即,在你的机器 - 大概64位 - 是8个字节。

不能使用sizeof()来恢复一个动态分配的结构的大小,但您可以静态分配的人这样做。



Answer 4:

如果你想知道你分配什么尺寸,然后你需要“记住”你自己,因为你的代码做了分配。 如果你的代码没有做过配置,那么就没有办法[在一个标准的意义]找出内存有多大的指针指向。 你只需要“知道”一些其他的方式。



文章来源: C, Malloc() and array length [duplicate]
标签: c arrays malloc