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

How to get array size within function?

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

#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 与主函数中的第二行相同。但是,输出不同:

Array size: 12, element size: 1. Array size: 4, element size: 1.

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

所以我的问题是:

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

  2. 如何从函数中获取实际数组大小(数组中元素的数量),而不将大小作为参数传递,而不使用诸如在递增计数器时遍历数组等方法until '\0' is reached - 这是获取数组大小的最简单方法,无论上下文如何。

  3. 顺带一提,负责记忆数组大小的compiler/system存放数组大小的地方呢?它如何与数组相关联以及如何检索?

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

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

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

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