2011-03-30 36 views
1

遇到一些麻烦了解这两个代码段之间的差: 我分配动态范围内我的代码为一个整数数组空间与以下语句时的动态存储器分配和sizeof()

int *arr = calloc(cnt, sizeof(int)); 

在另一个函数中,我通过了arr,我想确定arr中的大小(元素数量)。 当我打电话

int arr_sz = sizeof(arr)/sizeof(int); 

它只返回1,这是一个字节的只是数目为两个参数的int我假定(4/4)= 1。 我只是认为这将是一样使用阵列

int arr[8]; 
    int arr_sz = sizeof(arr)/sizeof(int); 

返回数组中元素的实际数量。

如果有人可以清除这件事,那会很好。谢谢!

+0

数组是公正的指针,编译器可以帮助您管理。一旦他们通过一个函数,或者如果动态分配,编译器不能帮助你。 – slezica 2011-03-30 20:22:38

+0

@Santiago Lezica :: *数组只是指针,编译器可以帮助您管理* - >这很奇怪。请通过 - http://www.lysator.liu.se/c/c-faq/c-2.html – Sadique 2011-03-30 20:27:52

+0

您在报价中减半了我的评论。另一半很重要。 char a [10]和char * a之间显然有区别,当你键入一行或另一行时会发生不同的事情。 – slezica 2011-03-30 20:34:36

回答

8
int *arr; ----> Pointer 
int arr[8]; ----> Array 

首先是你得到了什么那里 - int *arr是一个指针,指向一些字节的内存位置,数组。

数组的类型和指针是不一样的

在另一个我通过arr的函数中,我想确定arr中的大小(数字元素)。当我打电话

int arr_sz = sizeof(arr)/sizeof(int); 

它只返回1,这是个字节在一个int为两个参数我假定(4/4)= 1只的数量。我只是认为这将是相同的使用数组

即使是假设阵列 - 这是因为,当传递到功能阵列得到腐朽为指针。您需要显式传递函数中的数组大小作为单独的参数。

经历这一:

Sizeof an array in the C programming language?

有一个static阵列和动态存储器分配之间的差。

sizeof运算符不能在动态分配上工作。 AFAIK它最适合基于堆栈和预定义的类型。

+0

曾经是一个数组?自从我完成C并且我的记忆力不好以来,我已经有一段时间了,但是我不认为arr被声明和初始化的方式会使它成为一个数组? – 2011-03-30 20:19:47

+0

这个。没有办法动态确定C中数组的大小 – 2011-03-30 20:20:07

1

麦克,

arr是一个指针,因此,在系统的至少上,具有相同数目的字节作为int的。数组并不总是与指向数组类型的指针相同。

2

好吧,int *arr声明了一个指针,一个保存其他变量地址的变量,它的大小是一个整数的大小,因为它是一个指针,它只需要保留地址,而不是指针本身。
int arr[8]声明一个数组,一个整数集合。 sizeof(arr)指的是整个集合的大小,所以8 * sizeof(int)。
通常你会听到“数组和指针是相同的东西”。那是不是是真的!他们是不同的东西。

0

sizeof(arr)sizeof(int*)相同,即单个指针的大小。但是,您可以将arr_sz计算为... cnt

0

*arrarr[8]不同,因为它的大小在编译时是未知的,sizeof是编译器的函数。所以当你的arr*arr时,sizeof将以字节返回指针的大小(sizeof(int *)),而当你的arrarr[8]时,sizeof将返回以字节为单位的8个整数数组的大小(which is sizeof(int) * 8)。

当你将一个指向数组的指针传给一个函数时,你必须指定它的大小,因为编译器不能为你做。另一种方法是用null元素结束数组,并执行while循环。

0

如果有int arr1[8] ARR1的类型(只要编译器而言)是大小为8

的阵列整数在该示例int * arr2 ARR2的类型是指针的整数。

sizeof(arr1)是int阵列
sizeof(arr2)的尺寸被一个int指针的大小(4个字节的32位系统中,8个字节的64位系统上)

因此,唯一的区别是类型,编译器认为该变量是。

0

不能使用的sizeof带记忆指针:

int *arr = calloc(cnt, sizeof(int)); 

但它的确定与阵列使用它:

int arr[8];