计算字符指针数组的大小

Calculate size of array of character pointers

本文关键字:数组 字符 指针 计算      更新时间:2023-10-16

我在C 中有以下函数

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

我试过

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

但这并不能给我正确的答案。

注意功能原型

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);

有两种方法:

  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]);

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

解决方法是在函数中添加一个大小参数,如下所示:

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中的数组只是一块内存,你可以碰巧将其视为一堆相邻的变量。没有内置的方法来计算块中有多少变量,因为没有内置的方式来标记块的开始或结束。

char* param1[]

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

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

是指针的大小乘以指针的大小,即1。并且它不是阵列的大小