我在C
中有以下功能int func(char* param1[], int param2[])
{
//Want to calculate size of param1 array
}
我试过
n = sizeof(param1)/sizeof(char*);
但这并没有给我正确答案。
答案 0 :(得分:3)
注意函数原型
int func(char* param1[], int param2[]);
相当于
int func(char **param1, int *param2);
这意味着函数参数param1
和param2
是指针,而不是数组。指针和数组是不同的类型。
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)
有两种方法可以做到这一点:
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
。它不是数组的大小