计算字符指针数组的大小
Calculate size of array of character pointers
我在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);
这意味着函数参数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);
有两种方法:
- 最简单也是最明显的,在函数参数中传递长度
- 在数组末尾有一个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
。并且它不是阵列的大小
相关文章:
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 按字符值访问int数组
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- C++ 带结构的数组字符
- 数组字符包含量超出预期
- 读取文件并添加到数组字符
- 如何在Qt中更改或替换数组字符
- 为什么编译器不在参数中传递数组字符 *arr[] 的大小?
- 井字棋数组字符错误
- 分割数组字符