【问题标题】:How to get array size within function?如何在函数中获取数组大小?
【发布时间】:2017-01-18 16:13:51
【问题描述】:

我无法找到从函数中获取数组大小的方法。这是我的代码:

#include <stdio.h>

void printBuff(char *buf);
int main()
{
    char arr[12] = "csdlnclskjn";
    printf("Array size: %d, element size: %d. ",sizeof(arr), sizeof(arr[0]));
    printBuff(arr);
    return 0;
}

void printBuff(char *buf){
    printf("Array size: %d, element size: %d.",sizeof(buf), sizeof(buf[0]));
}

如上所示,printBuff 的作用与 main 函数中的第二行相同。但是,输出不同:

数组大小:12,元素大小:1。数组大小:4,元素大小:1。

想了想,就明白为什么printBuff()方法的输出是4了。实际上,arr 是指向数组第一个元素的指针。在 32 位架构上,sizeof(arr) 将返回 4,在 64 位架构上它将返回 8。我不明白为什么 sizeof(arr) 返回数组的大小而不是字节数在 main() 函数中使用时的指针。毕竟,当在 main() 中调用 arr 时,它仍然是一个指针,对吧?

所以我的问题是:

  1. sizeoff() 的解释如何根据使用的上下文而有所不同?这取决于什么?

  2. 如何从函数中获取实际数组大小(数组中元素的数量),而不将大小作为参数传递,不使用诸如迭代数组等方法,同时递增计数器直到 '\0 ' 达到 - 只是获取数组大小的最简单方法,无论上下文如何。

  3. 顺便说一句,负责记住数组大小的编译器/系统在哪里存储数组的大小?它是如何与数组关联的,又是如何检索的?

我想使用 sizeof(buf), / sizeof(buf[0]) 作为数组的大小来迭代数组,但显然这是不可能的。

【问题讨论】:

  • 你的数组衰减到函数中的一个指针。这是已知的 all ,因此您也必须传递数组长度。数组的大小(在main 中)与指针的大小(在函数中)不同。
  • @WeatherVane:它没有在函数中转换。它在计算参数表达式时,在调用函数之前进行转换。
  • @KeithThompson 哦,真遗憾。然后“在”函数。
  • @WeatherVane:这是一个重要的区别。有一个常见的误解,认为将数组表达式传递给函数是一种特殊情况。它不是。 “转换”发生在评估数组表达式时(有一些规定的例外情况)。

标签: c arrays size


【解决方案1】:

以下是我对您问题的回答:

  1. 数组在传入函数时“转换”为char* 类型(使用 char* 参数)。
  2. AFAIK 没有这样的方法。您可以对字符串使用 strlen 函数。否则,您必须将长度作为参数传递。
  3. How does an array pointer store its size?

在传递数组参数时不要使用sizeof(buf)/sizeof(buf[0]) 来获取数组的长度。见this。了解更多信息。

【讨论】:

  • 反对sizeof(buf)/sizeof(buf[0]) 的论点仅适用于数组parameters(因为在C 中没有数组参数之类的东西)。它不起作用,因为看起来像数组参数的实际上是指针参数。如果buf 是一个数组对象,sizeof buf / sizeof buf[0] 可以正常工作。
  • 感谢您的评论。我同意,我正在编辑我的答案。虽然,它在我包含的链接中有所描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 2021-06-07
  • 1970-01-01
  • 2021-02-13
  • 2021-03-23
相关资源
最近更新 更多