Как узнать количество элементов в массиве char **? - PullRequest
2 голосов
/ 13 апреля 2011

У меня есть строковый массив в виде 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 ]

6 голосов
/ 13 апреля 2011

С C вам придется следить за этим самостоятельно.

2 голосов
/ 13 апреля 2011

У вас есть несколько вариантов:

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'.
1 голос
/ 13 апреля 2011

Вы никак не можете определить длину массива, единственный способ, которым вы могли бы сделать это, это сделать это динамически.У вас есть массив строк (char**), поэтому у вас есть указатель на первый символ первого элемента массива.Мы все знаем, что в C все строки должны редактироваться с '\ 0', так что вы можете "отсканировать" строки массива, взяв этот указатель и сохранив его, затем увеличивая его, пока не получите '\ 0'.Следующий указатель является первым символом следующей строки и т. Д.

Но в этом есть огромный недостаток: память не так линейна, как кажется.Я хочу сказать, что ваша первая строка может быть полностью выделена, например, по адресу 0x0010101A, а следующая - по адресу 0xF0FF0001, поэтому либо у вас огромная строка @ 0x0010101A, либо между ними куча данных, и вы не знаете,если они являются частью строки или нет.

И именно поэтому вам необходимо вести счетчик количества строк, которые у вас есть.:)

PS: и поскольку это число всегда больше нуля, вы должны использовать unsigned int для его ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...