我很难理解这两个代码段之间的区别:我用下面的语句在代码中为整数数组动态分配空间
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);
返回数组中元素的实际数量。
如果有人能把这个弄清楚,那就太好了,谢谢!
8条答案
按热度按时间rqmkfv5c1#
首先,
int *arr
是一个指针,* 指向一些 * 字节的内存位置,* 不是 * 一个数组。Array和Pointer的 type 不一样。
即使它被 * 假定 * 为 * 一个数组--这是因为数组在传递给函数时会衰减为指针。你需要在函数中显式地传递数组大小作为一个单独的参数。
通过这个:
Sizeof an array in the C programming language?
static
数组和动态内存分配之间存在差异。sizeof运算符不能用于动态分配。AFAIK它最适合基于堆栈的和预定义的类型。
pengsaosao2#
int *arr
声明了一个指针,一个保存其他变量地址的变量,它的大小是一个整数的大小,因为它是一个指针,它只需要保存地址,而不是指针本身。int arr[8]
声明了一个数组,一个整数的集合。sizeof(arr)
指的是整个集合的大小,所以8*sizeof(int)。你经常听到“数组和指针是一回事”。这不是真的!它们是不同的东西。
slmsl1lt3#
迈克
arr
是一个指针,因此,至少在您的系统上,与int
具有相同的字节数。数组的类型并不总是与指向数组类型的指针相同。ctrmrzij4#
sizeof(arr)
与sizeof(int*)
相同,即单个指针的大小。然而,您可以将arr_sz
计算为...cnt
!0dxa2lsx5#
*arr
与arr[8]
不同,因为它的大小在编译时是未知的,而sizeof是编译器的一个函数。因此,当您的arr
是*arr
时,sizeof将返回指针的大小。(sizeof(int *)
),而当你的arr
是arr[8]
时,sizeof将返回8个整数的数组的大小(which is sizeof(int) * 8
)。当你传递一个指向数组的指针给一个函数时,你必须指定它的大小,因为编译器不能为你做这件事。另一种方法是用null元素结束数组,然后执行一个while循环。
vkc1a9a26#
如果你有
int arr1[8]
,arr1的类型(就编译器而言)是一个大小为8的int数组。在
int * arr2
例子中,arr2的类型是一个整型指针。sizeof(arr1)
是int数组的大小sizeof(arr2)
是int指针的大小(32位系统上为4字节,64位系统上为8字节)所以,唯一的区别是编译器认为变量是什么类型。
jmp7cifd7#
sizeof不能用于内存指针:
但是可以将其用于数组:
wljmcqd88#
我今天遇到了同样的问题,并打算提出新的问题,但在这篇文章中找到了我的答案。只是张贴我的答案,因为我甚至其他人都可以发现它很有用。这是我的代码:
输出:
这里我期望数组的总大小可能是40,但由于sizeof运算符不适用于动态分配的数组,它只返回int指针的大小4。仅供参考,我使用Visual Studio 2017与Windows 10