Как заполнить массив структур с полем char*?
Есть структура:
typedef struct Word {
unsigned int code; // код слова
char * value; // значение
} Word;
и есть массив структур
Word * dictionary [4096];
Для заполнения такой код:
// заполняем первые 256 слов словаря
// память под значение слова и \0
char * iv = malloc (2 * sizeof(char));
for (int i = 0; i < 256; i++){
iv [0] = i;
iv [1] = '\0';
// копируем строку в словарь
dictionary[i]->code = i;
strcpy (dictionary[i]->value, iv);
}
free (iv);
for (int i = 0; i < 256; i++) printf ("значение слова : \t %s", dictionary[i]->value);
Получаю программный краш. Думаю, это из-за того, что поле value может занимать сколько угодно байт и malloc не знает, сколько памяти выделять. Как правильно заполнять такие массивы?
Теперь заполняю массив так:
char * iv = malloc (2 * sizeof(char));
for (int i = 0; i < 256; i++){
iv [0] = i;
iv [1] = '\0';
dictionary[i]-> value = malloc (2 *sizeof(char)); // выделяем память
strcat (dictionary[i]->value, iv);
}
free (iv);
for (int i = 0; i < 256; i++){
printf ("имя %s", dictionary[i]->value);
free (dictionary[i]->value); // освобождаем память
}
Но это не решило проблему.
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
А выделять память в структуре? Если у вас все "слова" по одному символу - ну напишите не char*value, а char value[2] и копируйте прямо в него...
for (int i = 0; i < 256; i++){
// копируем строку в словарь
dictionary[i]->code = i;
dictionary[i]->value[0] = (char)i;
dictionary[i]->value[0] = 0;
}
Всяко размер 2 байта даже меньше указателя - экономим память! :)
Если же вы планируете какие-то реально большие слова писать - то выделяйте память
dictionary[i]->value = malloc(....
strcpy(dictionary[i]->value, ....
Только не забудьте потом ее освободить.