2012-05-21 8 views
4

Мне нужен массив строк. Длина строки известна во время компиляции, и очень важно, чтобы каждая строка занимала столько места. С другой стороны, количество строк известно только во время выполнения. Каков синтаксис для этого?Объявление массива переменной длины строк фиксированной длины

char* data[STRLENGTH] является неправильным синтаксисом. char** data в основном работает, но затем sizeof(data[0]) неправ - он должен быть равен STRLENGTH.

ответ

9

@Daniel правильно, но этот код может сбить с толку людей, которые читают его - это не то, что вы обычно делаете. Для того, чтобы сделать его более понятным, я предлагаю вам сделать это в два этапа:

typedef char fixed_string[STRLENGTH]; 
fixed_string *data; 
+0

Это не * это * смущает; указатели на массивы не намного сложнее, чем указатели на другие типы. Просто приоритет '[]' over '*' требует явной группировки. –

+0

Мой первый инстинкт, когда я вижу что-то вроде char (* data), - это найти указатель на функцию. Во всяком случае, вряд ли существует недостаток в определении промежуточного типа (вы передадите его по ссылке, а не по стоимости, не ожидая этого, но это не всегда проблема) – zmbq

5
char* data[STRLENGTH] 

объявляет массив указателей на STRLENTGHchar. Чтобы объявить указатель на массив STRLENGTHchar с, используйте

char (*data)[STRLENGTH] 
+0

Хотя нужно помнить, что если Эрик передает это через границы функций, он не должен использовать 'sizeof', чтобы получить размер строки из-за разложения указателя. – birryree

+1

'data' - указатель, поэтому проблема распада отсутствует. 'data [i]', OTOH, является выражением массива и что * будет * распадаться на указатель, если он передается функции. –

4
char (*data)[LEN];     // where LEN is known at compile time 
... 
data = malloc(sizeof *data * rows); // where rows is determined at run time 
... 
strcpy(data[i], some_name); 
... 
printf("name = %s\n", data[i]); 
... 
free(data); 

Обратите внимание, что data является тип указателя, а не тип массива (data является указателем на LEN элементного массива char). Вызов malloc будет динамически выделять достаточно памяти для хранения rows массивов длины LEN. Каждый data[i] будет иметь тип char [LEN].

Смежные вопросы