【问题标题】:Calculate size of array of character pointers [duplicate]计算字符指针数组的大小[重复]
【发布时间】:2014-04-24 06:03:20
【问题描述】:

我在 C 中有以下函数

int func(char* param1[], int param2[])
{
//Want to calculate size of param1 array
}

我试过了

n = sizeof(param1)/sizeof(char*);

但这并没有给我正确的答案。

【问题讨论】:

  • 你无法计算这个数组的大小,你需要将长度作为参数传递
  • param1[] 数组是否以某种方式终止?也许数组的最后一个元素是 NULL?
  • 如果问题是关于 C 的,为什么要标记为 [c++]

标签: c++ c function sizeof


【解决方案1】:

注意函数原型

int func(char* param1[], int param2[]);

等价于

int func(char **param1, int *param2);

这意味着函数参数param1param2 是指针,而不是数组。指针和数组是不同的类型。

sizeof(param1) / sizeof(char*);
// equivalent to
sizeof(char **) / sizeof(char *)  // always 1

上面的表达式总是计算为1,因为所有指针类型的大小都是相同的(除了一个函数指针,sizeof 运算符可能不适用)。

那是因为您不能将数组传递给函数。实际上传递的是指向数组第一个元素的指针。指针没有传递给函数的数组的大小信息。因此,您必须将数组长度显式传递给您的函数。它应该有原型

int func(char *param1[], int param2[], int len_param1, int len_param2);

【讨论】:

    【解决方案2】:

    有两种方法:

    1. 最简单最明显的,在函数参数中传递长度
    2. 在数组末尾有一个 NULL(NULL 终止符):

    char arr[] = { "what", "so", "ever", NULL };然后循环:

    int i;
    for (i = 0; arr[i] != NULL; i++)
       ...
    

    但是,如果您将上面示例中的数组传递给该函数(静态数组),只需使用相同的逻辑将长度作为参数传递...

    func(arr, sizeof(arr) / sizeof(arr[0]);

    【讨论】:

    • "NULL" 应该是NULL
    • @millinon 哇,谢谢!
    【解决方案3】:

    C 不够聪明,无法在运行时知道数组的大小。它只能告诉你数据类型的大小,这是在编译时确定的。

    解决这个问题的方法是给函数加一个size参数,像这样:

    int func(char* param1[], int param2[], int n)
    

    或者使用一个以null结尾的数组,这样你就可以使用循环来遍历数组:

    int func(char* param1[], int param2[]){
        int size;
        for(size = 0; param1[size] != NULL; size++);
        ...
    

    关键是,C 中的数组只是一块内存,您可以碰巧将其视为一堆彼此相邻的变量。没有内置方法可以确定块中有多少变量,因为没有内置方法来标记块的开始或结束。

    【讨论】:

    • 为了完整起见,在 C++ 中,数组的大小是类型的一部分(这部分也可能是 C 的一部分),因此可以提取此 如果你有一个数组。一旦你处理了一个指针(就像在数组衰减为指针的许多情况下发生的那样),所有的大小信息都会丢失。
    • 您能否举例说明在 C/C++ 中提取任意数组大小的方法?据我所知,没有任何方法可以在运行时确定任意数组的长度,即使在创建它的上下文中也是如此。
    • 没有C/C++。在 C++ 中,template <size_t N> constexpr size(T(&)[N]) {return N;} 可以解决问题。这个大小是已知的编译时间。
    • 不过,这仍然是一个编译时构造,类似于 sizeof()。这个以及类似的问题似乎都与运行时大小推导有关。
    • 是的,所有类型的大小在编译时都是已知的。
    【解决方案4】:
    char* param1[]
    

    将使param 成为char ** 类型的指针,因此结果为

    n = sizeof(param1)/sizeof(char*);
    

    是指针大小乘以指针大小,即1。它不是数组的大小

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 1970-01-01
      • 2013-08-29
      • 2019-11-17
      • 1970-01-01
      • 2013-01-25
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多