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

时间:2016-09-10 19:17:09

标签: c arrays size

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

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

所以我的问题是:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. 当传入函数(使用char *参数)时,数组被“转换”为char*类型。
  2. AFAIK没有这样的方法。您可以对字符串使用strlen函数。否则,您必须将长度作为参数传递。
  3. 请参阅How does an array pointer store its size?
  4. 传递数组参数时,不要使用sizeof(buf)/sizeof(buf[0])来获取数组的长度。见this。了解更多信息。