C动态内存分配和sizeof()

时间:2011-03-30 20:14:11

标签: c memory

我在理解这两个代码段之间的区别时遇到了一些麻烦: 我使用以下语句在代码中动态地为整数数组分配空间

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

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

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

它只返回1,这只是我假设(4/4)= 1的两个参数的int中的字节数。 我只是假设它与使用数组

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

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

如果有人能清楚这一点,那就太好了。谢谢!

7 个答案:

答案 0 :(得分:8)

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

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

数组和指针的类型不一样

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

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

它只返回1,这只是我假设(4/4)= 1的两个参数的int中的字节数。我只是假设它与使用数组

相同

即使它假设 一个数组 - 这是因为Arrays在传递给函数时会被衰减为指针。您需要在函数中显式传递数组大小作为单独的参数。

通过这个:

Sizeof an array in the C programming language?

static数组和动态内存分配之间存在差异。

sizeof运算符不适用于动态分配。 AFAIK最适合基于堆栈和预定义的类型。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

迈克,

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

将指向数组的指针传递给函数时,必须指定其大小,因为编译器无法为您执行此操作。另一种方法是使用null元素结束数组,并执行while循环。

答案 5 :(得分:0)

如果你有int arr1[8] arr1的类型(就编译器而言)是一个大小为8的数组。

在示例int * arr2中,arr2的类型是指向整数的指针。

sizeof(arr1)是int数组的大小
sizeof(arr2)是int指针的大小(32位系统上4个字节,64位系统上8个字节)

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

答案 6 :(得分:0)

您不能将 sizeof 与内存指针一起使用:

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

但是可以将它与数组一起使用:

int arr[8];