#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'.