【问题标题】:C - sizeof int array always returns 4 [duplicate]C - sizeof int 数组总是返回 4 [重复]
【发布时间】:2012-05-03 09:18:15
【问题描述】:

可能重复:
sizeof array of structs in C?
sizeof an array passed as function argument

只是想写一个基本的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++。

【问题讨论】:

  • arr 是一个指针,而不是一个数组。您在函数声明中使用的语法对于int sum(int *arr) 来说简直是锦上添花。您可能想阅读comp.lang.c FAQ 的第 6 部分。
  • 在 64 位机器上编译,您应该看到 8,因为您查看的是指针的大小而不是数组的大小。

标签: c gcc dev-c++


【解决方案1】:

作为函数参数,数组衰减为指向元素类型的指针,所以sizeof arrsizeof(elem*)

您必须将元素的数量作为额外的参数传递,无法从指向数组第一个元素的指针中确定这一点(在这种情况下实际传递的是什么)。

【讨论】:

  • 如果问题包含'4',则发布'sizeof(pointer)'
  • 如何指向数组本身而不是第一个元素?将长度作为第二个参数传递并不是程序员必须适应的弱点。
  • 如果你有int arr[5];,那么&amp;arr给你一个指向五个intint (*)[5]的数组的指针。但是,该地址与&amp;arr[0] 相同,即数组第一个元素的地址。您想要什么类型的指针取决于具体情况。对于数组元素求和,除非您想为每个大小(int sum_5(int (*)[5]);int sum_6(int (*)[6]);)设置不同的函数,否则您必须传递 int* 和元素的数量。这就是 C 的工作原理。
  • @Daniel @dissident 我不明白你为什么不能只使用sizeof(array) / sizeof(array[0])。它对我有用。
  • @B1KMusic 在array 指代实际数组的范围内,这是有效的。但是在int sum(int arr[]) 中,名称arr 不是指数组,而是指int*。所以如果你在那个函数中计算sizeof arr / sizeof arr[0],你会得到sizeof(int*) / sizeof(int)
猜你喜欢
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2020-09-16
  • 1970-01-01
  • 2012-09-16
相关资源
最近更新 更多