Как заполнить массив структур с полем 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, ....

Только не забудьте потом ее освободить.

→ Ссылка