在C中查找malloc()数组长度?

在C中查找malloc()数组长度?,c,arrays,malloc,C,Arrays,Malloc,可能重复: 我正在学习如何用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])); 这就是我期望发生的事情。但是,如果我将数组的大小设置为: int *num; num = malloc(10 *

可能重复:

我正在学习如何用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]));
这就是我期望发生的事情。但是,如果我将数组的大小设置为:

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]));

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

时数组的大小不是40。在第二种情况下,
num
不是数组,而是指针
sizeof
为您提供指针的大小,在您的平台上似乎是8字节


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

第二个大小是指指针的大小,在您的计算机中,指针的大小可能是64位,即8字节

不能使用
sizeof()
来恢复动态分配结构的大小,但可以对静态分配的结构进行恢复。

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

第一个是数组-因此
sizeof
给出数组的大小=40字节


第二个是指针(不管它指向多少个元素)sizeof为您提供
sizeof(int*)

如果您想知道分配的对象的大小,那么您需要自己“记住”,因为您的代码进行了分配。如果您的代码没有完成分配,那么[在标准意义上]就无法确定指针指向的内存有多大。你只需要“知道”其他的方式

num
在第二种情况下是指向int的指针,其大小取决于机器,即对于32位,它是4字节,对于64位,它是8字节。而在第一种情况下,num不是数组的指针,它是数组的
基址,因此
sizeof()
给出了数组的总大小。您知道
free
函数是如何工作的,编译器或O/S会记录/跟踪堆分配的块,然后只提供指针就可以释放它,而不需要
num
的数量,那么为什么编译器供应商可以向用户提供从堆记录中检索此
num
的功能?因为它已经在那里了。。。每当用户调用
free(ptr)
@BuddhikaChaturanga抱歉,我不确定自己是否理解正确:您是否在问为什么实现不公开堆分配内存块的详细信息?比如,给一个指针获取信息?是的。。。如果他们已经有了关于动态分配数据的信息,如果他们免费使用它,那么为什么他们不能向用户(开发人员)提供功能来获取这些信息……)@Buddhikachaturaga如果一个实现暴露了这样的细节,那么他们将成为他们接口的一部分,将来他们将不能自由地更改它。此外,您还可以拥有指向已分配内存块中间的指针:在这种情况下,您会怎么做?
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