2015-10-12 2 views
0

Мне нужно объявление структуры, которое содержит одну строку, которую я могу затем создать массив (так что в основном массив указателей на строки). Я знаю, как создать массив структур, каждый из которых содержит строку:C reallocing typedef?

typedef char line_t[MAX_INPUT + 1]; 

typedef struct { 
line_t text; 
} lines; 

lines *arrayoflines; 
arrayoflines = (char *)calloc(MAX_INPUT + 1, sizeof(char)); 

Здесь нет проблем. Однако, что, если количество символов в строке, которая должна быть сохранена, проходит границы MAX_INPUT? Я чувствую, что мне нужно будет realloc char line_t[MAX_INPUT + 1], и это то, что я абсолютно не знаю, как это сделать.

Редактировать: Похоже, некоторые думали, что количество строк в массиве строк было проблемой. Я имел в виду перераспределение длины строки, которая может быть сохранена в каждом элементе в массиве строк.

+0

почему не только предотвратить ввод от превышения MAX_INPUT – Les

+0

@Les вопрос о назначении университета - я не знаю размер самого вход. Это может быть что угодно. Мой лектор - суровый человек. – Laefica

+0

все еще, вы будете знать размер вашего ввода, когда ваша программа его прочитает. как и для вашего первоначального выделения, обычно это будет ... arrayoflines = calloc (1, sizeof (lines)); – Les

ответ

2

У вас есть предел для максимальной строки, определенной в вашем массиве. Поэтому я предполагаю, что любая данная строка никогда не будет превышать ее (вы должны проверить свой ввод, если это предположение неверно). Вы можете прочитать более короткую строку в строке line_t (завершая свою строку с помощью NULL), но вы не сможете восстановить пространство в памяти. Если у вас не так много ожидаемых строк, будет использоваться подход с фиксированным буфером, т. Е. Вам не потребуется перераспределение.

Однако, если вам нужно быть эффективным с пространством, возможно, потому, что вы будете читать миллионы строк, вам следует выделить память для каждой строки. Другими словами, вы можете рассмотреть возможность изменения line_t на char * вместо char [MAX_INPUT + 1]. Они семантически равны для ваших целей программирования. Но за сценой вы не устанавливаете фиксированный размер.

typedef char* line_t; 

line_t *arrayoflines; 
arrayoflines = calloc(1, sizeof(line_t)); 
arrayoflines[0] = calloc(MAX_INPUT + 1, sizeof(char)); 

//if you learn the size after reading into the buffer, and it's smaller, 
// realloc the buffer - be sure to include space for NULL and be sure it 
// is set to NULL 
arrayoflines[0] = realloc(arrayoflines[0], (new_smaller_count+1) * sizeof(char)) 
arrayoflines[0][new_smaller_count] = NULL; 
+0

Почему 'new_smaller_count' необходимо установить в' NULL'? – Laefica

+0

@Laefica - вы правы, если начальное выделение calloc'ed, оно уже null. У меня есть привычка явно хранить NULL. – Les

+0

О, да. Извините, я прочитал это неправильно. Не видели, чтобы они привыкли. Мой преподаватель/преподаватель всегда делал в этой ситуации 'arrayoflines [0] [new_smaller_count] = '\ 0'' – Laefica

3

Лучше выделить память для каждой строки. То есть вместо массива статических массивов line_t[MAX_INPUT + 1] define array of char Указатели: char ** arrayoflines.

+0

Под этим вы подразумеваете выделение памяти каждому элементу массива структур отдельно? – Laefica

+0

@Laefica Не массив структур, а массив 'char'-s. Труднее сделать отдельный «malloc», но использование памяти будет оптимальным. С помощью статических массивов вы будете тратить память на неиспользуемые символы. – i486

+1

Вы должны выделить память для каждого элемента: 'arrayoflines [0] = (char *) malloc (line_len + 1)'. Затем вы можете скопировать строку: 'strcpy (arrayoflines [0], _your_string_buf_)'. PS: Не забудьте «свободные» элементы в конце. – i486

0

, если вы не можете гарантировать, что все входы будет меньше или равна MAX_INPUT, вы должны преобразовать динамическое выделение вместо этого. и что вы должны сделать это:

typedef struct { 
    char * text; 
} lines; 
lines *arrayoflines; 
arrayoflines = calloc(MAX_LINES, sizeof(lines)); 

и для каждого элемента (п) выделить THE_DESIRED_INPUT_SIZE для этого элемента;

arrayoflines[n].text=calloc(THE_DESIRED_INPUT_SIZE, sizeof(char)); 

(п) находится в диапазоне [0, MAX_LINES-1]