【问题标题】:c array size's change when used inside a functionc数组大小在函数内使用时的变化
【发布时间】:2015-08-03 22:45:08
【问题描述】:

我有这段代码:

#include <stdio.h>

int max_number(int numbers_array[]);

int main(){
    int numbers_array[] = {10, 20, 30, 40, 50, 10, 60, 2500, 25555};
    printf("size: %d\n", sizeof(numbers_array));
    max_number(numbers_array);
    return 0;
 }

int max_number(int numbers_array[]){
    printf("size of array: %d\n", sizeof(numbers_array));
}

输出是:

size: 36
size of array: 8

但是输出应该是一样的吧? 有谁知道问题是什么? 非常感谢你。

【问题讨论】:

  • 不,不应该。在声明数组的 main() 中,sizeof 返回分配的大小:36 字节。在 max_number 内部,它不知道分配给数组的字节数,因为它只传递了一个指针,而 sizeof 只是给出了指针的大小(8 个字节)。
  • 有一种方法可以检测数组的大小,但最好只是将大小作为附加参数传递。
  • 发布的代码无法干净地编译。 1) sizeof() 返回“size_t”,而不是“int”,因此两个 printf() 语句都需要更正格式字符串。 2) max_number() 函数被声明为返回一个'int',但没有返回语句。强烈建议:编译时,启用所有警告(对于gcc,至少使用:'-Wall -Wextra -pedantic')
  • @Beta:令人印象深刻。你如何在 C 中模拟模板? ;-)
  • @Olaf [facepalm!] 没关系...

标签: c arrays sizeof


【解决方案1】:

当然。 首先是声明变量的大小

int numbers_array[] = {10, 20, 30, 40, 50, 10, 60, 2500, 25555}

即使在编译时它的大小也是众所周知的:9 个元素 * 每个 4 字节 = 36 字节

第二个是指向整数的指针大小,8字节(64位寻址)

关键是该函数在任何时候都无法知道其数组参数的大小。由于数组是指针,所以它总是只能看到一个指针。

以下

int max_number(int numbers_array[])

等价于

int max_number(int *numbers_array)

【讨论】:

    【解决方案2】:

    不,不应该。在声明数组的 main() 中,sizeof 返回分配的大小:36 字节。在 max_number 内部,它不知道分配给数组的字节数,因为它只传递了一个指针,而 sizeof 只是给出了指针的大小(8 个字节)。

    【讨论】:

      【解决方案3】:

      数组在用作函数的参数时会衰减为指针。因此,如果您在函数内检查数组变量的大小,它将显示指针的大小。因此,如果您有一个问题,如何找到数组的大小,最简单的答案是将它作为另一个变量传递给函数。

      更多信息:http://c-faq.com/aryptr/aryptrparam.html

      【讨论】:

        猜你喜欢
        • 2017-12-06
        • 2012-12-12
        • 1970-01-01
        • 2023-02-23
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 2016-05-12
        • 2021-11-10
        相关资源
        最近更新 更多