Где ошибка, вызывающая переполнение кучи-буфера? - PullRequest
0 голосов
/ 28 апреля 2019

Я новичок в C, но я пытаюсь решить проблему с LeetCode, чтобы получить больше опыта с хеш-таблицами.Запуск на моем собственном компьютере с Linux (конечно, без активации флага очистки адреса, моя программа, кажется, работает правильно, но решение функции в LeetCode всегда дает мне ошибку для переполнения кучи-буфера. Я не знаю, как это интерпретироватьи не знаю, что вызывает переполнение, я не могу найти место в своем коде, где я перехожу любую границу.

Это проблема из LeetCode:

Учитываямассив целых чисел, возвращает индексы двух чисел, так что они складываются в определенную цель.

Вы можете предположить, что каждый вход будет иметь ровно одно решение, и вы не можете использовать один и тот же элемент дважды.

Пример:

Учитывая числа = [2, 7, 11, 15], target = 9,

Поскольку числа [0] + числа [1] = 2 + 7= 9, return [0, 1].

Это мое решение (я использую шаблон LeetCode для функции "twoSum". Я не нахожу использование для "returnSize", но я просто оставил его там):

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

struct hashTable
{
    int key;
    int value;    
};

int hash_number(int key, int size)
{
   return key%size; 
}

int* twoSum(int* nums, int numsSize, int target, int* returnSize){

    int i;
    int hashNumber;
    int *returnArray;
    int complement;

    returnArray=(int*)malloc(2*sizeof(int));
    returnArray[0]=-1;
    returnArray[1]=-1;

    struct hashTable *inputNumbers;
    inputNumbers=(struct hashTable*)malloc(numsSize*sizeof(struct hashTable));
    for(i=0; i<numsSize; i++)//filling up hash table
    {
        hashNumber=hash_number(nums[i], numsSize);
        inputNumbers[hashNumber].key=i;
        inputNumbers[hashNumber].value=nums[i];
    }

    for(i=0; i<numsSize; i++)
    {
        complement=target-nums[i];
        hashNumber=hash_number(complement, numsSize);
        if((inputNumbers[hashNumber].key!=i) && (inputNumbers[hashNumber].value==hashNumber))
        {
            returnArray[0]=i;
            returnArray[1]=inputNumbers[hashNumber].key;
        }
    }

    return returnArray;
}

Когда я выполняю тестовый прогон на своем Линух машина, работает нормально.Но в Leetcode я получаю ошибку, которая выглядит примерно так (я не копировал все это):

=======================================================================
30==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x606000000070 at pc
READ of size 4 at 0x60000000080 thread T0 #2 0x7....... in __lib_Start_main....

Любая помощь очень ценится!: D

...