2012-12-22 85 views
9

可能重复:
How to find the sizeof(a pointer pointing to an array)C,malloc()和数组长度

我正在学习如何创造下的动态数组,但所遇到的问题,我可以不知道。

如果我使用的代码:

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

+0

'num'是第二种情况下指向int的指针,其大小取决于机器,即对于32位,它是4字节,对于64位,它是8字节。而在第一种情况下,num不是指针,它是'base数组的地址'sizeof()'给出数组的总大小。 。 – krpra

回答

16

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

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

+0

你知道'free'函数是如何工作的,编译器或O/S保存堆分配块的记录/跟踪,然后只用提供指针就可以释放,不需要'num'的数量,那么为什么编译器厂商可以提供一个功能让用户从堆记录中检索这个'num'? 因为它已经在那里......每当用户调用'免费(ptr)' –

+0

@BuddhikaChaturanga对不起,我不确定自己的理解是否正确:你问为什么不实现公开有关堆分配的内存块的细节?喜欢,给一个指针获取信息? – effeffe

+0

是啊...如果他们已经有了关于动态分配数据的信息,如果他们使用它作为'free',那他们为什么不能向用户(Developers)提供功能以获得这样的信息...... :) –

2

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

您不能使用sizeof()来恢复动态分配结构的大小,但是您可以为静态分配的结构执行此操作。

4

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

第一个是一个数组 - 所以sizeof为您提供了数组的大小= 40个字节。

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

0

如果你想知道你分配的东西的大小,那么你需要自己“记住”,因为你的代码做了分配。如果你的代码没有完成分配,那么就没有办法[在标准意义上]找出指针指向的内存有多大。你只需要“知道”一些其他的方式。