如何查找 char** 数组的大小
How to find size of char** array
如何求char**数组的大小,我一直在做
int getSize(char** args)
{
int size = (int)sizeof(args)/ (int)sizeof(arg[0]);
return size;
}
但它只返回值 1。我似乎不知道如何找出我的 char* 数组中有多少个元素。
argv
和环境 table(在大多数实现中)使用标准方法:终止指向字符串的 char *
指针数组 NULL
:
Array element Points to
0 -> "string 0"
1 -> "string 1"
2 -> "string 2"
. -> .
. -> .
. -> .
N -> "string N"
N+1 -> NULL
所以你会用这样的东西来计算尺寸:
int getSize(char** args)
{
int size = 0;
while ( args[ size ] )
{
size++;
}
return( size );
}
在 c 中没有确定数组大小的“好”方法。因此,有很多设计模式要么具有静态大小的数组,要么在末尾放置一些定界符以表示数组的结尾(例如,所有字符串末尾的空字节)。
因此,根据您在此处的用例,无论何时您想调用 getSize
时传递 argc
参数,或者在 [=13] 的末尾存储一个 NULL 都可能是有意义的=] 并遍历数组直到找到它:
// snake case is generally standard for c
int get_size(char** args)
{
int i = 0;
// check that the first element of each arg is not ‘[=10=]’
for ( ; args[i] != NULL; ++i) {
}
return i;
}
如果没有这些方法中的任何一种,您可能会遇到访问未分配或已释放内存的问题,并且没有处理这些问题的好方法,任何尝试肯定会降低可读性。
问题是 args
是一个指针(实际上是指向指针的指针),而不是数组,所以 sizeof
技巧不起作用 - 你正在除以大小a char **
乘以 a char *
的大小,在你的机器上它们是相同的,所以你得到的结果是 1.
指针值中没有元数据告诉您它是指向单个对象还是对象序列中的第一个对象,或者序列中有多少个对象 - 这些信息必须单独跟踪。
正如安德鲁指出的那样,在这种情况下,您通常必须依赖标记值来标记序列的结束。
如何求char**数组的大小,我一直在做
int getSize(char** args)
{
int size = (int)sizeof(args)/ (int)sizeof(arg[0]);
return size;
}
但它只返回值 1。我似乎不知道如何找出我的 char* 数组中有多少个元素。
argv
和环境 table(在大多数实现中)使用标准方法:终止指向字符串的 char *
指针数组 NULL
:
Array element Points to
0 -> "string 0"
1 -> "string 1"
2 -> "string 2"
. -> .
. -> .
. -> .
N -> "string N"
N+1 -> NULL
所以你会用这样的东西来计算尺寸:
int getSize(char** args)
{
int size = 0;
while ( args[ size ] )
{
size++;
}
return( size );
}
在 c 中没有确定数组大小的“好”方法。因此,有很多设计模式要么具有静态大小的数组,要么在末尾放置一些定界符以表示数组的结尾(例如,所有字符串末尾的空字节)。
因此,根据您在此处的用例,无论何时您想调用 getSize
时传递 argc
参数,或者在 [=13] 的末尾存储一个 NULL 都可能是有意义的=] 并遍历数组直到找到它:
// snake case is generally standard for c
int get_size(char** args)
{
int i = 0;
// check that the first element of each arg is not ‘[=10=]’
for ( ; args[i] != NULL; ++i) {
}
return i;
}
如果没有这些方法中的任何一种,您可能会遇到访问未分配或已释放内存的问题,并且没有处理这些问题的好方法,任何尝试肯定会降低可读性。
问题是 args
是一个指针(实际上是指向指针的指针),而不是数组,所以 sizeof
技巧不起作用 - 你正在除以大小a char **
乘以 a char *
的大小,在你的机器上它们是相同的,所以你得到的结果是 1.
指针值中没有元数据告诉您它是指向单个对象还是对象序列中的第一个对象,或者序列中有多少个对象 - 这些信息必须单独跟踪。
正如安德鲁指出的那样,在这种情况下,您通常必须依赖标记值来标记序列的结束。