2

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

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

4

3 回答 3

6

使用 C,您必须自己跟踪这一点。

于 2011-04-13T01:02:46.903 回答
2

您无法推断数组的长度,唯一可以做到的方法是动态地进行。您有一个字符串数组 ( char**),因此您有指向数组第一个元素的第一个字符的指针。我们都知道,在 C 语言中,所有字符串都必须使用 '\0' 进行编辑,因此您可以“扫描”数组中的字符串,获取该指针并保存它,然后将其递增直到得到一个 '\0'。下一个指针是下一个字符串的第一个字符,依此类推。

但这有一个巨大的缺陷:内存并不像看起来那样线性。我的意思是你的第一个字符串可以完全分配在例如地址 0x0010101A,下一个在 0xF0FF0001,所以或者你有一个巨大的字符串 @0x0010101A 或者它们之间有一堆数据而你不知道它们是否是字符串的一部分。

这就是为什么您需要维护您拥有多少个字符串的计数器。:)

PS:由于这个数字总是大于零,所以你应该使用unsigned int它来输入它。

于 2011-04-13T01:16:29.077 回答
2

你有几个选择:

1) 传递一个 size 参数,该参数指示您的char **array.

2)声明一个char **arrayint array_size(实际上与#1相同)组合的结构。

3) If your array will always contain valid pointers (i.e. non-NULL) then create an extra element at the end which is always set to NULL. This acts as an array terminator, you can scan char **array looking for this terminating element:

int size;

for (size = 0; array[size] != NULL; size++);

// 'size' is number of valid entries in 'array'.
于 2011-04-13T02:44:31.953 回答