#include <stdio.h>
int *sum_returning_pointer(int *x, int *y)
{
// Call be reference
int z = (*x) + (*y);
return &z;
}
void main(int *argc, char *argv[])
{
int a = 1, b = 2;
int *p = sum_returning_pointer(&a, &b);
printf("Sum = %dn", *p);
}
使用上述函数,我试图将两个数字相加,这两个数字作为对被调用函数的引用传递,并返回指向存储sum的变量的指针。但我得到奇怪的错误说。
Error has occured.
Segmentation Fault.
这个错误是什么意思?我怎样才能得到一个解决方案?为什么会出现这个错误?
在main函数z是不可访问的,这就是为什么它显示未定义的行为。可以将z声明为全局变量,如
#include <stdio.h>
int z =0;
int * sum_returning_pointer(int *x, int *y)
{
// Call be reference
z = (*x) + (*y);
return &z;
}
void main(int *argc, char *argv[])
{
int a = 1, b = 2;
int *p = sum_returning_pointer(&a, &b);
printf("Sum = %dn", *p);
}
问题不在于如何解引用,而在于如何确保指针有效。在您的代码中,将返回一个局部变量的地址。当程序从函数返回时,此变量的生存期结束。在此之后解引用该指针将调用未定义行为。
注意,像int
这样典型的小对象应该按value返回。
从函数返回指向结果的指针有三种通用策略:
- (IMO,最好)让调用方处理生命周期
int *foo(const int *x, const int *y, int *z) {
*z = *x + *y;
return z;
}
用法:
int x = 1, y = 2, z;
int *res = foo(&x, &y, &z);
- 使用动态存储
int *foo(const int *x, const int *y) {
int *z = malloc(sizeof *z);
if (!z) {
// complain
return NULL;
}
*z = *x + *y;
return z;
}
这种解决方案往往非常缓慢且容易出错,因为调用者负责释放结果。
- 使用静态
int *foo(const int *x, const int *y) {
static int z;
z = *x + *y;
return &z;
}
可以很好地工作,因为静态变量的生命周期在程序的整个执行过程中延长。
主要问题是指针所指向的对象将随着每次调用foo
而改变。这对于多线程应用程序来说尤其危险。