вызов не выделяет правильные данные при возврате ссылки на указатель из разыменованного двойного указателя в функции

#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));

};
 

Я забыл инициализировать ..размер в структуре из функции. в результате произошла ошибка