Доступ к структуре в течение структурных времен 3? - PullRequest
0 голосов

У меня есть задание на C, и у меня возникают проблемы с доступом к различным членам в моих структурах (некоторые уровни глубоко).Я понимаю основные принципы, но я где-то теряю это.У меня есть 3 структуры, причем верхняя содержит массив второй, которая, в свою очередь, содержит массив третьей.Моя текущая проблема - правильно использовать malloc.Вот часть моего кода.Я был бы признателен за любую информацию или советы, потому что мне еще предстоит пройти долгий путь, и, как вы видите, структуры довольно сложны.

.h file

typedef struct user {
    char* userID;
    int wallet;
    bitCoinList userBC; //Also a list
    senderTransList userSendList; //Yes it has lists too..
    receiverTransList userReceiveList;
}user;

typedef struct bucket {
    struct bucket* next;
    user** users;
}bucket;

typedef struct hashtable {
    unsigned int hashSize;
    unsigned int bucketSize;
    bucket** buckets;
}hashtable;

Вотмоя функция для создания и инициализации хеш-таблицы .. Я получаю ошибку, когда пытаюсь получить доступ к пользователям с HT->buckets->users (запрос пользователей-членов в чем-то, не являющемся структурой или объединением)

.c file

// Creation and Initialization of HashTable
hashtable* createInit(unsigned int HTSize,unsigned int buckSize){

    hashtable* HT = (hashtable*)malloc(sizeof(hashtable));
    if(HT==NULL) {
        printf("Error in hashtable memory allocation... \n");
        return NULL;
    }

    HT->hashSize=HTSize;
    HT->bucketSize=buckSize;

    HT->buckets = malloc(HTSize * sizeof(HT->buckets));
    if(HT->buckets==NULL) {
        printf("Error in Buckets memory allocation... \n");
        return NULL;
    }
    HT->buckets->users = malloc(buckSize * sizeof(HT->buckets->users));
    if(HT->buckets->users==NULL) {
        printf("Error in Users memory allocation... \n");
        return NULL;
    }
    for(int i=0; i <HTSize; i++){
        HT->buckets[i] = malloc(sizeof(bucket));
        HT->buckets[i]->next = NULL;
        if(HT->buckets[i]==NULL) {
            printf("Error in Bucket %d memory allocation... \n",i);
            return NULL;
        }

        for(int j=0; j <buckSize; j++){
            HT->buckets[i]->users[j] = malloc(sizeof(user));
            if(HT->buckets[i]==NULL) {
                printf("Error in User %d memory allocation... \n",i);
                return NULL;
            }
        }
    }
    return HT;
}

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Так как buckets - это указатель на тип указателя, вам необходимо:

(*(HT-> buckets)) ->users = ....

или

HT-> buckets[0] ->users = ....   // or any other index depending of the program logic

или (для n-го указателя)

(*(HT-> buckets + n)) ->users = ....

или

HT-> buckets[n] ->users = ....   // or any other index depending of the program logic

Это только синтаксический ответ и я не анализирую логику программы

0 голосов
/ 09 марта 2019

По крайней мере, одна проблема: неправильное распределение размера.

Выделите размер данных, на которые указывает HT->buckets, а не размер указателя.

Избегайте ошибок.Приведенная ниже идиома проста для кодирования, просмотра и обслуживания.

ptr = malloc(sizeof *ptr * n);

// HT->buckets = malloc(HTSize * sizeof(HT->buckets));
HT->buckets = malloc(HTSize * sizeof *(HT->buckets));

// HT->buckets->users = malloc(buckSize * sizeof(HT->buckets->users));
HT->buckets->users = malloc(buckSize * sizeof *(HT->buckets->users));

// HT->buckets[i] = malloc(sizeof(bucket));
HT->buckets[i] = malloc(sizeof *(HT->buckets[i]));

// HT->buckets[i]->users[j] = malloc(sizeof(user));
HT->buckets[i]->users[j] = malloc(sizeof *(HT->buckets[i]->users[j]));
...