【发布时间】: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 时,它仍然是一个指针,对吧?
所以我的问题是:
sizeoff() 的解释如何根据使用的上下文而有所不同?这取决于什么?
如何从函数中获取实际数组大小(数组中元素的数量),而不将大小作为参数传递,不使用诸如迭代数组等方法,同时递增计数器直到 '\0 ' 达到 - 只是获取数组大小的最简单方法,无论上下文如何。
顺便说一句,负责记住数组大小的编译器/系统在哪里存储数组的大小?它是如何与数组关联的,又是如何检索的?
我想使用 sizeof(buf), / sizeof(buf[0]) 作为数组的大小来迭代数组,但显然这是不可能的。
【问题讨论】:
-
你的数组衰减到函数中的一个指针。这是已知的 all ,因此您也必须传递数组长度。数组的大小(在
main中)与指针的大小(在函数中)不同。 -
@WeatherVane:它没有在函数中转换。它在计算参数表达式时,在调用函数之前进行转换。
-
@KeithThompson 哦,真遗憾。然后“在”函数。
-
@WeatherVane:这是一个重要的区别。有一个常见的误解,认为将数组表达式传递给函数是一种特殊情况。它不是。 “转换”发生在评估数组表达式时(有一些规定的例外情况)。