该错误在哪里导致堆缓冲区溢出?

时间:2019-04-28 19:49:10

标签: c malloc address-sanitizer

我是C语言的新秀,但我正在尝试解决LeetCode的问题,以获得更多有关哈希表的经验。在我自己的Linux机器上运行(当然,如果不激活address sanitizer标志,我的程序似乎可以正常运行,但是解决LeetCode中的功能总是会给我一个堆缓冲区溢出错误。我不知道该怎么解释而且不知道是什么导致了溢出,所以我无法在代码中找到跨越任何边界的任何地方。

这是LeetCode中的问题:

给出一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标。

您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。

示例:

给出数字= [2,7,11,15],目标= 9,

因为nums [0] + nums [1] = 2 + 7 = 9, 返回[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;
}

当我在自己的Linux机器上运行测试时,它工作正常。但是在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

0 个答案:

没有答案