如何在函数内获取数组大小?

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

#include  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()函数中使用时的指针。 毕竟,arr,当在main()中调用时,仍然是一个指针,对吧?

所以我的问题是:

  1. 为什么sizeoff()的解释会有所不同,具体取决于使用它的上下文? 这取决于什么?

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

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

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

所以这是我对你的问题的答案:

  1. 传递给函数(使用char *参数)时,数组被“转换”为char*类型。
  2. AFAIK没有这样的方式。 您可以对字符串使用strlen函数。 否则,您必须将长度作为参数传递。
  3. 请参见数组指针如何存储其大小?

传递数组参数时,不要使用sizeof(buf)/sizeof(buf[0])来获取数组的长度。 看到这个 。 欲获得更多信息。