我已经开始学习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 = +
return ans;
}
将Sum存储在Different变量plus
中,并创建指向该变量plus
的指针*ans
,并返回保存plus
地址的指针变量ans