c-使用指针的分段故障(SIGSEGV)



我在想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;
}

https://ide.geeksforgeeks.org/Mk0sgwTsZf

首先,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));

我看到的问题是,在您的main()中,您有int * a;,但您从未使其指向有效内存,内容是不确定的。

稍后,将它作为参数传递给函数,在参数returnSize中接收它,并尝试取消引用它。从本质上讲,你是在取消引用一个无效的内存,这会导致未定义的行为。

然后,当对函数twoSum()的调用返回NULL时,您不能继续并取消查找返回的指针。您应该检查返回指针的非NULL值,并有条件地使用printf()调用(取消引用返回指针(。

最新更新