c-返回指针时出现分段错误



我已经开始学习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);
}

输出:

Enter number a : 10
Enter number b : 20
Segmentation fault

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

您正在初始化指向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);
}

并且添加空闲调用以释放所分配的存储器。

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

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

#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 = %dn", ans); 
    return 0;   
}
int sum(int *p, int *q)
{
    int result = *p + *q;
    return (result);
}

sum函数也可以类似于:

int sum (int *p, int *q)
{
    return (*p + *q);
}

编辑

正如@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 = %dn", ans);
    return 0;
}
void sum(int *result, int *p, int *q)
{
    *result = *p + *q;
}

在尝试存储任何内容之前分配内存,并检查malloc() 的返回

int *result = NULL;
result = malloc(sizeof(*result));
if(result != NULL)
    *result = *p + *q;
else
    printf("malloc returned error");

此外,检查main()中函数的返回并相应退出。

int main(void)
{
    .
    .
    .
    ans = sum(&a, &b);
    if(ans == NULL)
        return 0;
    printf("Sum = %dn", ans);
    free(ans);    //free the memory then
    return 0;
}

第三种选择是将ans声明为main函数中的普通int变量,并将指向它的指针传递给sum函数,就像处理其他两个参数一样。这实际上是通过引用来模拟调用

#include<stdio.h>
int *sum(int *, int *);
int main(void)
{
    int a, b;
    printf("Enter number a : ");
    scanf("%d", &a);
    printf("Enter number b : ");
    scanf("%d", &b);
    int* ans = sum(&a, &b);
    printf("Sum = %d", *ans); 
    return 0;   
}
int *sum(int *p, int *q)
{
    int plus = *p + *q;
    int *ans = &plus;
    return ans;
}
将Sum存储在Different变量plus中,并创建指向该变量plus的指针*ans,并返回保存plus 地址的指针变量ans

相关内容

  • 没有找到相关文章

最新更新