C动态内存分配和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
是一个指针,因此,至少在您的系统上,具有与int
相同的字节数。 数组并不总是与数组类型的指针相同。
sizeof(arr)
与sizeof(int*)
,即单个指针的大小。 但是你可以将arr_sz
计算为… cnt
!
*arr
与arr[8]
因为它的大小在编译时是未知的,而sizeof是编译器的函数。 所以当你的arr
是*arr
sizeof将以字节为单位返回指针的大小( sizeof(int *)
),而当你的arr
是arr[8]
,sizeof将返回8个整数的数组大小(以字节为单位) which is sizeof(int) * 8
)。
将指向数组的指针传递给函数时,必须指定其大小,因为编译器无法为您执行此操作。 另一种方法是使用null元素结束数组,并执行while循环。
如果你有int arr1[8]
,那么arr1的类型(就编译器而言)是一个大小为8的数组。
在示例int * arr2
的类型是指向整数的指针。
sizeof(arr1)
是int数组的大小
sizeof(arr2)
是int指针的大小(32位系统上4个字节,64位系统上8个字节)
因此,唯一的区别是编译器认为变量的类型。
你不能将sizeof与内存指针一起使用:
int *arr = calloc(cnt, sizeof(int));
但是可以将它与数组一起使用:
int arr[8];