使用指针的分段错误(SIGSEGV)

时间:2018-08-02 07:23:33

标签: c pointers

我正在考虑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

2 个答案:

答案 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()调用(取消对返回的指针的引用)。