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被声明为指针时,出现分段错误。但是,我无法找出相同的原因。任何有关这方面的帮助都是非常可观的。
您正在初始化一个指针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)