我正在考虑leetcode问题167,但是我的代码遇到问题Segmentation Fault (SIGSEGV)
。
下面是我的C代码,预期的答案是[1,3]。
#include<stdio.h>
#include<stdlib.h>
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
int i=0,j=0;
for(i=0;i<numbersSize;i++)
{
for(j=i+1;j<numbersSize;j++)
{
if(numbers[i]+numbers[j]==target)
{
*returnSize = 2;
int *indexes = malloc(*returnSize * sizeof(int));
indexes[0] = i + 1;
indexes[1] = j + 1;
return indexes;
}
}
}
*returnSize = 0;
return NULL;
}
int main()
{
int arr[]={2,3,4};
int *a;
int *p=twoSum(arr,3,6,a);
printf("%d,%d",*p,*(p+1));
return 0;
}
答案 0 :(得分:0)
首先,a
未初始化,您可以调用 malloc 函数来分配内存或将指针传递给本地int a
变量
int a;
int *p=twoSum(arr,3,6,&a);
第二秒,您的twoSum
函数可以返回NULL值,因此,如果该返回值不为NULL,则应添加条件以检查此返回值
int a;
int *p=twoSum(arr,3,6,&a);
if(p)
printf("%d,%d",*p,*(p+1));
答案 1 :(得分:0)
我所看到的问题是,在您的main()
中,您拥有int * a;
,但是您从未将其指向有效的内存,其内容是不确定的。 / p>
稍后,将其作为参数传递给函数,在参数returnSize
中接收它,然后尝试取消引用。本质上,您是取消引用了导致未定义行为的无效内存。
然后,当您对函数twoSum()
的调用返回一个NULL
时,您不得继续并取消对返回的指针的重新引用。您应该检查返回的指针的非NULL值,并有条件地使用printf()
调用(取消对返回的指针的引用)。