为什么将 C-Array 传递给函数时 sizeof() 值错误?

新手上路,请多包涵

完整示例:

 #include <stdio.h>

void test(int arr[]) {
    int arrSize = (int)(sizeof(arr) / sizeof(arr[0]));
    printf("%d\n", arrSize); // 2 (wrong?!)
}

int main (int argc, const char * argv[]) {
    int point[3] = {50, 30, 12};

    int arrSize = (int)(sizeof(point) / sizeof(point[0]));
    printf("%d\n", arrSize); // 3 (correct :-) )

    test(point);

    return 0;
}

在将它传递给函数之前, sizeof 给了我正确的值。对函数中完全相同的数组执行完全相同的操作会产生奇怪的结果。少了一个元素。为什么?

原文由 dontWatchMyProfile 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 918
2 个回答

当您将数组传递给 C 中的函数时,数组衰减为指向其第一个元素的指针。当您在参数上使用 sizeof 时,您获取的是指针的大小,而不是数组本身。

如果您需要该函数知道数组的大小,则应将其作为单独的参数传递:

 void test(int arr[], size_t elems) {
   /* ... */
}

int main(int argc, const char * argv[]) {
   int point[3] = {50, 30, 12};
   /* ... */
   test(point, sizeof(point)/sizeof(point[0]));
   /* ... */
}

另请注意,出于类似的原因(采用 sizeof 指针), sizeof(point)/sizeof(point[0]) 技巧不适用于动态分配的数组,仅适用于堆栈上分配的数组。

原文由 Nick Meyer 发布,翻译遵循 CC BY-SA 2.5 许可协议

因为数组在作为函数参数传递时会 衰减 为指针,所以 sizeof 分别为 32 位和 64 位平台提供 4 和 8。

原文由 Nikolai Fetissov 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题