Ошибка выполнения из-за «unsigned int»

пытаюсь решить 217. Содержит дубликат в C с помощью HashSet.

после того, как я попытался сделать расчетный индекс всегда (+), я получил ошибку.


#define BUCKET_SIZE 1000

typedef struct ListNodes {
  int val;
  struct ListNodes* next;
} ListNode;

typedef struct {
  ListNode* buckets[BUCKET_SIZE];
} MyHashSet;

// create hash table
MyHashSet* myHashSetCreate() {
    MyHashSet* obj = (MyHashSet*) malloc(sizeof(MyHashSet));
    for(int i = 0 ; i < BUCKET_SIZE ; i++ ) {
        obj -> buckets[i] = NULL;
    }
    return obj;
}

bool myHashSet(MyHashSet* obj, int key) {
    unsigned int index =  key % BUCKET_SIZE; // problem here
    ListNode* current = obj->buckets[index];
    while(current != NULL) {
        if (current -> val == key) return true;
        current = current -> next;
    } 
    
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
    newNode->val = key;
    newNode->next = obj->buckets[index];
    obj->buckets[index] = newNode;
    return false;
}

// task function

bool containsDuplicate(int* nums, int numsSize) {
     MyHashSet* obj = myHashSetCreate();
     for(int i = 0 ; i < numsSize ; i++) {
        if (myHashSet(obj, nums[i])) {
            return true;
        }
     }
    return false;
}


unsigned int index = key % BUCKET_SIZE;

результат :

Строка 23: Символ 15: ошибка выполнения: загрузка адреса 0x6258000078f0 с недостаточным пространством для объекта типа «struct ListNode *» [solution.c] 0x6258000078f0: примечание: здесь указывает указатель

ListNode* current = obj->buckets[index];

я исправил ошибку:

int index = key % BUCKET_SIZE;

или

int index =  key % BUCKET_SIZE;
    if ( index < 0) {
        index *= -1;
    }

есть идеи, почему код ведет себя странно?

В сторону: Не приводите результат malloc.

SafelyFast 29.04.2024 20:12

Маам-мэм, Любопытно, почему код использует int для индексации buckets[] в obj -> buckets[i] = NULL;, а позже использует unsigned в obj->buckets[index] = newNode;? Совет: лучший тип индексации массива — size_t, беззнаковый тип.

chux - Reinstate Monica 29.04.2024 20:18

Примечание @chux-ReinstateMonica принято !! ты мне очень помог, еще раз спасибо

Maam maam 29.04.2024 20:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Избегайте знаковой математики:

bool myHashSet(MyHashSet* obj, int key) {
    unsigned int index =  key % BUCKET_SIZE;

изменить на

bool myHashSet(MyHashSet* obj, unsigned key) {
    unsigned int index =  key % BUCKET_SIZE;
// or 
bool myHashSet(MyHashSet* obj, int key) {
    unsigned int index =  (unsigned) key % BUCKET_SIZE;
// or 
// #define BUCKET_SIZE 1000
#define BUCKET_SIZE 1000u
// or ...

При исходном unsigned int index = key % BUCKET_SIZE;key % BUCKET_SIZE вычисляет остаток , который находится в диапазоне от -999 до 999. Преобразование отрицательного числа в unsigned приводит к большим значениям unsigned.

Ты легенда, спасибо, приятель! Я только сегодня изучил unsigned и относился к нему как к встроенной функции, а не как к типу данных. моя глупость всегда меня удивляет

Maam maam 29.04.2024 20:16

Другие вопросы по теме