Выделение памяти для массива строк в c

Я в процессе создания хеш-таблицы. Я использую структуру для емкости, количества клавиш, частот и самих клавиш. Вот мой код для инициализации структуры:

htable htable_new(int capacity) {

  htable result = emalloc(sizeof *result);
  result->capacity = capacity;
  result->frequencies = emalloc(capacity * sizeof result->frequencies[0]);
  result->keys = emalloc(capacity * sizeof result->keys[0]);
  result->frequencies = 0;
  result->keys = NULL;

  return result;
}

Насколько я понимаю, массив char** является указателем на массив указателей (типа char)? Итак, когда я выделяю память, правильно ли использовать keys[0]? Я предполагаю, что это просто представляет размер указателя char? Что приводит к моему следующему вопросу о том, когда я на самом деле устанавливаю ключи в массиве (который, очевидно, находится в другой функции), должен ли я просто выделять память для каждого индекса по размеру строки, которую я ввожу перед ее сохранением?

i.e. h->keys[index] = emalloc(sizeof(str)

Спасибо за ваши ответы!


person Paldan    schedule 24.08.2014    source источник


Ответы (1)


Предполагая, что emalloc является допустимым макросом или функцией,

Звонки

result->frequencies = emalloc(capacity * sizeof result->frequencies[0]);
result->keys = emalloc(capacity * sizeof result->keys[0]);

ОК. Однако следующие две строки:

result->frequencies = 0;
result->keys = NULL;

немедленно вызвать утечку памяти. Я не знаю, зачем они тебе. Их следует удалить.

Предполагая, что str имеет тип char* или char const*, строка

h->keys[index] = emalloc(sizeof(str));

не выделит необходимый объем памяти для h->key[index]. Это выделит достаточно памяти для хранения только char*. Тебе нужно:

h->keys[index] = emalloc(strlen(str)+1);
strcpy(h->keys[index], str);
person R Sahu    schedule 24.08.2014
comment
Эй, спасибо за ваш ответ, который я использовал: result-›частоты = 0; и результат-›keys = NULL; потому что я хотел установить все элементы равными 0 и NULL соответственно. Как мне это сделать? - person Paldan; 24.08.2014
comment
Вы можете использовать calloc. - person R Sahu; 24.08.2014