繁体   English   中英

C动态内存分配和sizeof()

[英]C dynamic memory allocation and sizeof()

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

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

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

如果有人能解决这个问题,那就太好了。 谢谢!

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

首先,您到达那里int *arr是一个指针, 指向内存位置的某些字节, 而不是数组。

数组和指针的类型不同

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

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

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

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

通过以下步骤:

C语言中数组的大小

static数组和动态内存分配之间有区别。

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

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

麦克风,

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

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

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

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

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

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

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

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

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

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

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

int arr[8];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM