Я хотел бы иметь массив строк фиксированной длины в c в виде указателя, чтобы я мог динамически распределять память для него. Я вижу множество ссылок на массивы указателей на строку, но не на то, чего я хочу достичь.

Я хочу иметь возможность объявить указатель на char [MAX_STRING_LENGTH], чтобы я мог динамически распределять непрерывный блок памяти для всех строк:

char *(names[MAX_STRING_LENGTH]);  // This won't work
names = (some cast)malloc(NUM_STRINGS * MAX_STRING_LENGTH);

И затем получить доступ к массиву строк:

strcpy(name, names[stringIndex]);

Как мне объявить переменную и привести указатель из malloc?

1
Dan 1 Сен 2017 в 16:50

4 ответа

Лучший ответ

Вы объявляете names как массив указателей, а не указатель на массивы. Это было бы

char (*names)[MAX_STRING_LENGTH];  // Names is a pointer to an array of char

Теперь вы можете выделить память для указателя:

// Allocate memory for NUM_STRINGS arrays and assign the pointer to names
names = malloc(NUM_STRINGS * sizeof *names);
3
Some programmer dude 1 Сен 2017 в 13:54

Вам необходимо понять концепцию Pointer Arrays. См. Книгу «Язык программирования C» Денниса М. Ритчи и Кернигана. Специально указатель и часть массива. Есть несколько удивительных вещей для чтения. Возможно, вы получите более глубокое представление об указателях и массивах после прочтения и решения некоторых проблем, приведенных в книге.

0
krpra 1 Сен 2017 в 14:08

Вам нужен указатель на массив MAX_LENGTH из char с использованием cdecl (обратите внимание, что cdecl не понимает такие вещи, как MAX_LENGTH, поэтому вместо этого мы используем здесь число):

% cdecl
Type `help' or `?' for help
cdecl> declare names as pointer to array 256 of char;
char (*names)[256]

Мы получаем, что правильное объявление

char (*names)[MAX_LENGTH];

Однако это все еще не очень полезно, потому что realloc действие будет очень дорогостоящим, потому что, возможно, может потребоваться переместить каждую строку в новое место. Поэтому я предлагаю вам использовать указатель для указания на символ .

2
Antti Haapala 1 Сен 2017 в 15:28

Некоторые программисты уже предоставили решение.

Как правило, поскольку типы C / C ++ могут стать несколько сложными, вы можете использовать любую полуприличную IDE для поиска правильных определений типов.

Этот прием основан на ключевом слове C ++ 11 auto, которое определяет тип переменной по инициализатору. Полученный тип все еще может использоваться в других версиях C / C ++ и не ограничивается C ++ 11.

В вашем случае укажите тип, который вы знаете и который можно преобразовать в тип, который вы хотите:

char names[10][10];

Затем присвойте переменную auto с желаемым типом:

auto names2 = &names[0];

Проверьте фактический тип names2 и используйте его. Например, в Visual Studio просто наведите курсор мыши на names2, чтобы увидеть тип. Большинство IDE будут отображать тип, наведя курсор на ключевое слово auto или определенную переменную.

Например, при наведении указывается тип char (*names2)[10].

1
grek40 1 Сен 2017 в 14:38