代码之家  ›  专栏  ›  技术社区  ›  Maam maam

运行时错误,因为“unsigned int”

  •  1
  • Maam maam  · 技术社区  · 2 年前

    试图解决 217. Contains Duplicate 在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;
        }
    

    知道为什么代码的行为很奇怪吗?

    1 回复  |  直到 2 年前
        1
  •  1
  •   chux    2 年前

    避免 签署 数学

    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 计算 remainder 其在-999到999的范围内。将负数转换为 unsigned 大的 无符号的 vales。