Как найти количество элементов в массиве char **?

#c #pointers #char-pointer

#c #указатели #символ-указатель

Вопрос:

У меня есть массив строк в форме 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;
}
  

Любая помощь была бы высоко оценена!
Спасибо.

Ответ №1:

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

Комментарии:

1. Правильный ответ на огромное количество вопросов типа «Как вы находите количество …» в c.

Ответ №2:

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

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

И именно поэтому вам нужно поддерживать счетчик того, сколько строк у вас есть. 🙂

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

Ответ №3:

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

1) Передайте параметр size, вокруг которого указывается текущий размер вашего char **array .

2) Объявите структуру, которая объединяет char **array с int array_size (на самом деле такая же, как #1).

3) Если ваш массив всегда будет содержать допустимые указатели (т. Е. ненулевые), то создайте дополнительный элемент в конце, который всегда имеет значение NULL . Это действует как ограничитель массива, вы можете сканировать char **array в поисках этого завершающего элемента:

 int size;

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

// 'size' is number of valid entries in 'array'.