如何查找char **数组中的元素数量?

时间:2011-04-13 01:00:41

标签: c pointers char-pointer

我有一个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;
}

任何帮助将不胜感激! 感谢。

3 个答案:

答案 0 :(得分:6)

使用C,你必须自己跟踪它。

答案 1 :(得分:2)

您有几个选择:

1)传递一个尺寸参数,指示char **array的当前尺寸。

2)声明一个将char **arrayint 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进行输入。