我有一个char **
形式的字符串数组我很难找到那个数组的长度:
typedef struct _stringArray
{
int (*Length)(char**);
char** (*Push)(char**, char*);
char** (*Pop)(char**, char*);
}StringArray;
StringArray* StringArray_Constructor(void)
{
StringArray* stringArray = (StringArray *)malloc(sizeof(StringArray));
stringArray->Push = StringArray_Push;
stringArray->Pop = StringArray_Pop;
}
char** StringArray_Push(char** array, char* string)
{
int size = 0; //how to find how many elements in the array object???
array = realoc(array, (sizeof(char *) * (size + 1));
array[size] = string;
return array;
}
任何帮助将不胜感激! 感谢。
答案 0 :(得分:6)
使用C,你必须自己跟踪它。
答案 1 :(得分:2)
您有几个选择:
1)传递一个尺寸参数,指示char **array
的当前尺寸。
2)声明一个将char **array
与int array_size
结合在一起的结构(与#1真的相同)。
3)如果您的数组将始终包含有效指针(即非NULL),则在末尾创建一个额外的元素,该元素始终设置为NULL
。这充当数组终止符,您可以扫描char **array
查找此终止元素:
int size;
for (size = 0; array[size] != NULL; size++);
// 'size' is number of valid entries in 'array'.
答案 2 :(得分:1)
你无法推断数组的长度,你能够做的唯一方法就是动态地进行。你有一个字符串数组(char**
),所以你有指向数组第一个元素的第一个字符的指针。我们都知道,在C中,所有字符串都必须带有'\ 0',所以你可以“扫描”数组的字符串,然后保存它,然后递增它直到得到'\ 0'。下一个指针是下一个字符串的第一个字符,依此类推。
但这有一个巨大的缺陷:记忆并不像它看起来那样线性。我所说的是你的第一个字符串可以完全分配在例如地址0x0010101A,下一个字符串在0xF0FF0001,所以或者你有一个巨大的字符串@ 0x0010101A或者它们之间有一堆数据你不知道如果他们是字符串的一部分。
这就是为什么你需要维护一个你有多少弦的计数器。 :)
PS:并且由于此数字始终大于零,您应使用unsigned int
进行输入。