返回指针时出现分段错误

Ozi*_*ick 1 c pointers segmentation-fault

我已经开始学习 C 语言中的指针。

当我尝试在函数中返回指针时,segmentation fault出现错误。

这是代码:

#include<stdio.h>

int *sum(int *, int *);

int main(void)
{
    int a, b;
    int *ans = NULL;
    printf("Enter number a : ");
    scanf("%d", &a);
    printf("Enter number b : ");
    scanf("%d", &b);

    ans = sum(&a, &b);
    printf("Sum = %d", *ans); 

    return 0;   
}

int *sum(int *p, int *q)
{
    int *result = NULL;
    *result = *p + *q;
    return (result);
}
Run Code Online (Sandbox Code Playgroud)

和输出:

Enter number a : 10
Enter number b : 20
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

sum当函数result被声明为指针时,出现分段错误。但是,我无法找出相同的原因。任何有关这方面的帮助都是非常可观的。

LPs*_*LPs 5

您正在初始化一个指针NULL,然后您正在推迟它:这是未定义的行为

sum功能更改为

int *sum(int *p, int *q)
{
    int *result = malloc(sizeof(int));

    // check if malloc returned a valid pointer before to dereference it
    if (result != NULL)
    {
        *result = *p + *q;
    }

    return (result);
}
Run Code Online (Sandbox Code Playgroud)

并添加一个free调用来释放分配的内存。

    // check if sum function allocate the pointer before to dereference it
    if (ans != NULL)
    {
       printf("Sum = %d", *ans); 
    }

    free(ans);

    return 0;   
}
Run Code Online (Sandbox Code Playgroud)

您还可以避免使用指针返回值:

#include<stdio.h>

int sum(int *, int *);

int main(void)
{
    int a, b;
    int ans;
    printf("Enter number a : ");
    scanf("%d", &a);
    printf("Enter number b : ");
    scanf("%d", &b);

    ans = sum(&a, &b);
    printf("Sum = %d\n", ans); 

    return 0;   
}

int sum(int *p, int *q)
{
    int result = *p + *q;
    return (result);
}
Run Code Online (Sandbox Code Playgroud)

sum功能也可以是这样的:

int sum (int *p, int *q)
{
    return (*p + *q);
}
Run Code Online (Sandbox Code Playgroud)

编辑

正如@JonathanLeffler 在他的回答中所写,您也可以这样做:

#include<stdio.h>

void sum(int *, int *, int *);

int main(void)
{
    int a, b;
    int ans;
    printf("Enter number a : ");
    scanf("%d", &a);
    printf("Enter number b : ");
    scanf("%d", &b);

    sum(&ans, &a, &b);
    printf("Sum = %d\n", ans);

    return 0;
}

void sum(int *result, int *p, int *q)
{
    *result = *p + *q;
}
Run Code Online (Sandbox Code Playgroud)

  • 学习指针的教训之一是何时使用它们,何时不使用它们。 (4认同)