计算字符指针数组的大小

时间:2014-04-24 06:03:20

标签: c++ c function sizeof

我在C

中有以下功能
int func(char* param1[], int param2[])
{
//Want to calculate size of param1 array
}

我试过

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

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

4 个答案:

答案 0 :(得分:3)

注意函数原型

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 :(得分:1)

有两种方法可以做到这一点:

  1. 最简单,最明显的是,在函数参数
  2. 中传递长度
  3. 在数组末尾有一个NULL(NULL-terminator):
  4. char arr[] = { "what", "so", "ever", NULL };然后循环:

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

char* param1[]

会使param成为char **类型的指针,因此

的结果
n = sizeof(param1)/sizeof(char*);

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