#c #gcc #calloc #double-pointer
Вопрос:
Я пытаюсь использовать calloc для динамического выделения данных указателю структуры в другой структуре.
Если я выделяю непосредственно из основной процедуры, проблем нет. Если я передаю двойной указатель на функцию инициализации с параметром ** в качестве параметра и использую оператор стрелки для ссылки на адрес, данные распределяются неправильно, и я получаю «ошибку с плавающей запятой» при кодировании хэша.
Этот код работает так, как я хочу.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*create item structure, this will hold allocated pointers to the key/value elements.*/
struct H_item_t{
char* key;
int* value;
};
typedef struct H_item_t H_item_t;
/*create the table structure, this will point to the initial item address.*/
struct HashTable_T {
size_t size;
H_item_t* items;
};
typedef struct HashTable_T HashTable_T;
int encodeKey(HashTable_T* table, char* key){
/*encode the string*/
size_t index = 0; //initialize value to full
size_t length = strlen(key); //get length of string
size_t i = 0; //initialize loop;.
for (; i < length; i ) {
index ^= (key[i]);
};
index %= table->size;
return index;
}
void hashItem(HashTable_T* table, char* string, int value ){
H_item_t* ptr1;
int index = encodeKey(table,string);
ptr1= amp;table->items[index];
ptr1->key=string;
ptr1->value=(int)value;
}
int* getValue(HashTable_T* table, char* key){
int index = encodeKey(table,key);
H_item_t* ptr1;
ptr1= amp;table->items[index];
return ptr1->value;
}
void deleteTable(HashTable_T* table){
free(table->items);
free(table);
};
void initTable(HashTable_T** table, int size){
(*table) = (HashTable_T*)malloc(sizeof(HashTable_T));
(*table)->items = (H_item_t*)calloc(size,sizeof(H_item_t));
};
int main()
{
HashTable_T* ht1 = malloc(sizeof(HashTable_T));
ht1->size=10;
ht1->items=(H_item_t*)calloc(ht1->size,sizeof(H_item_t));
hashItem(ht1,"A",3);
hashItem(ht1,"B",2);
hashItem(ht1,"C",1);
hashItem(ht1,"D",100);
printf("value returned from get: %xn",(int)getValue(ht1,"D"));
deleteTable(ht1);
}
Если я использую initTable() fxn;
HashTable_T* ht1;
initTable(amp;ht1,10);
вместо;
HashTable_T* ht1 = malloc(sizeof(HashTable_T));
ht1->size=10;
ht1->items=(H_item_t*)calloc(ht1->size,sizeof(H_item_t));
Я получаю «исключение с плавающей запятой» во время выполнения
Комментарии:
1.
initTable
не задаетsize
поле.2. Убедитесь, что приведение типов выполнено правильно. ptr1->значение=(int*)значение;
3. второй параметр должен установить это значение равным 10, которое затем передается в calloc как int. Я также пробовал как; initTable(amp;ht1,(int)10);
4. » второй параметр должен установить это значение равным 10 «. Да, так и должно быть. Но дело в том, что код, как показано на рисунке, этого не делает. Недостающий
(*table)->size = size;
5. @kaylum спасибо! в этом-то и была проблема. Я отвечу на это решением
Ответ №1:
решение;
Не забудьте инициализировать всех участников в структуре.
Это рабочий код для инициализируемого fxn;
void initTable(HashTable_T** table, int size){
//return allocated memory to the pointer that is held in the double pointer
(*table) = (HashTable_T*)malloc(sizeof(HashTable_T));
(*table)->size = size;
(*table)->items = (H_item_t*)calloc((*table)->size,sizeof(H_item_t));
};
Я забыл инициализировать ..размер в структуре из функции. в результате произошла ошибка