我是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