如何取消引用函数返回的指针?
How to dereference the pointer returned by a function?
#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 = %d\n", *p);
}
使用上述函数,我试图将作为引用传递给被调用函数的两个数字相加,并返回指向存储总和的变量的指针。但是我说的是奇怪的错误。
Error has occured.
Segmentation Fault.
What does this error mean?
How can i achieve a solution ?
Why does this error occurs ?
在 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 = %d\n", *p);
}
问题不在于如何解除引用,而在于如何确保指针有效。在您的代码中,返回了局部变量的地址。当程序 returns 来自函数时,此变量的生命周期结束。之后取消引用此指针会调用 Undefined Behavior.
请注意,像 int
这样的小对象通常应该按值返回。
有 3 种从函数返回指向结果的指针的通用策略。
- (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
的每次调用而改变。这对于多线程应用程序尤其危险。
#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 = %d\n", *p);
}
使用上述函数,我试图将作为引用传递给被调用函数的两个数字相加,并返回指向存储总和的变量的指针。但是我说的是奇怪的错误。
Error has occured.
Segmentation Fault.
What does this error mean? How can i achieve a solution ? Why does this error occurs ?
在 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 = %d\n", *p);
}
问题不在于如何解除引用,而在于如何确保指针有效。在您的代码中,返回了局部变量的地址。当程序 returns 来自函数时,此变量的生命周期结束。之后取消引用此指针会调用 Undefined Behavior.
请注意,像 int
这样的小对象通常应该按值返回。
有 3 种从函数返回指向结果的指针的通用策略。
- (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
的每次调用而改变。这对于多线程应用程序尤其危险。