c - 查找数组大小时出错

标签 c arrays sizeof

我正在尝试计算 C 中数组的大小。

我的第一个实现是基于 this question 已接受的答案:

int size = sizeof(arr)/sizeof(arr[0]);

但这总是给了我一个。我尝试这样做:

int size = sizeof(arr);

无论数组的大小如何,这每次都会给我 4。

这是我使用的代码的最小示例。

void findSize(int arr[]) {
    int size = sizeof(arr);
    printf("%d\n",size);
}

int main(int argc, char** argv) {
    int arr[] = {4,6,9,2,6,3,7,2,5,1,2};
    findSize(arr);
}

无论我使用什么数组,此代码始终打印 4。

为什么打印 4,如何找到数组的实际大小?

最佳答案

您的:

void findSize(int arr[]) {

相当于:

void findSize(int arr[3424]) {

这与:

相同
void findSize(int *arr) {

因此 findSize 中的 sizeof(arr) 计算指针的大小。

在 C99 中,您可以执行此操作 ( read more about it here ):

void findSize(int n, int arr[n]) {

但即使在这种情况下,sizeof(arr)也会返回指针的大小。

为什么?因为数组变量会自动衰减为指向其第一个元素的指针。

更新:C99 中的参数错误,sizeof 仅适用于函数体中声明的可变长度数组。感谢@rslemos。下标可以正确地推进嵌套数组的指针, see example .

关于c - 查找数组大小时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24538641/

相关文章:

c - Signal::expose-event 对 GdkWindow 和 GdkX11Window 无效

arrays - 自 iOS 14.5 以来,新的 `filter(_:)` 数组方法是什么?

c - 带成员的整个结构的大小

javascript - 如何传递带有斜杠或特殊字符的数组?

java - 如何在Java中用户一次输入字符串中的模式并将其存储为二维字符数组

c - 用指针声明的数组的大小

c++ - union 声明的两种不同语法如何给我不同的大小?

c - 我如何实际使用授权服务?

c - 具有启动条件的 Flex 可重入

c - C 中带有 malloc 的子字符串函数返回不正确的值