C语言 - sizeof int数组总是返回4

5

可能是重复的问题:
C中结构体数组大小?
作为函数参数传递的数组大小

我只是想写一个基本的sum()函数。

int sum(int arr[]) {
    int total = 0 , i = 0 , l = sizeof arr;

    for(i=0;i<l;i++) {
        total += arr[i];
    }

    return total;
}

l 总是等于 4(我知道最终要除以 sizeof int

在 Windows 7 中使用默认编译器选项运行 Dev-C++。


2
arr 是一个指针,而不是一个数组。在函数声明中使用的语法只是 int sum(int *arr) 的花哨写法。你可能想阅读 comp.lang.c FAQ 的第6节。 - pmg
编译在/为64位机器上,您应该看到8,因为您正在查看指针的大小而不是数组的大小。 - old_timer
1个回答

11
作为函数参数,数组会腐朽为指向元素类型的指针,因此sizeof arrsizeof(elem*)
您必须传递元素数量作为额外的参数,无法从指向数组第一个元素的指针(实际上传递的内容)中确定元素数量。

1
如果你有一个 int arr[5];,那么 &arr 会给你一个指向包含五个 int 的数组的指针,即 int (*)[5]。然而,这个地址与数组的第一个元素 &arr[0] 的地址相同。你需要什么类型的指针取决于情况。对于求和数组元素,除非你想为每个大小编写不同的函数(如 int sum_5(int (*)[5]);, int sum_6(int (*)[6]);),否则你必须传递一个 int* 和元素数量。这就是 C 的工作方式。 - Daniel Fischer
@Daniel @dissident 我不明白为什么你们不能直接使用 sizeof(array) / sizeof(array[0])。这个方法对我来说很有效。 - Braden Best
array 指代实际数组的范围内,这是可行的。但是在 int sum(int arr[]) 中,名称 arr 不是指代数组,而是指代 int*。因此,如果您在该函数中计算 sizeof arr / sizeof arr[0],您将得到 sizeof(int*) / sizeof(int) - Daniel Fischer
请返回已翻译的文本。 - Braden Best
@B1KMusic 是的。在那里,名称是指实际数组,所以它 必须 起作用。现在在问题的 sum 函数中添加一个 printf("%d\n", l);,并调用 sum(nums); sum(nums2); sum(nums3); - Daniel Fischer
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接