这是我有一个问题的程序:
#include<stdio.h>
#include<stdlib.h>
int * function1(int);
int * function2(int);
int main(void)
{
int * result1,* result2;
int val = 1000;
result1 = function1(val);
fprintf(stderr,"result1 = %d\n", *result1);
result2 = function2(val);
fprintf(stderr,"result2 = %d\n", *result2);
fprintf(stderr,"result1 = %d\n", *result1);
}
int * function1(int val)
{
int result = val + 1500;
return &result;
}
int * function2(int val)
{
int result = val - 1500;
return &result;
}
因此result1
最初设置为2500,result2
为-500。但是,代码在初始化后没有触及result1
,但它从2500
更改为其他内容。任何人都可以给我任何暗示,为什么会发生这种情况?
答案 0 :(得分:3)
从函数返回后,result
的内容将不再可用,因为局部变量在堆栈上分配(并在函数返回后“弹出”)。
尝试使用malloc / calloc动态分配内存:
int * function1(int val)
{
int *result = malloc(sizeof(int));
*result = val + 1500;
return result;
}
答案 1 :(得分:2)
result
是您的两个函数中的自动局部变量。一旦函数终止,它将不再存在。返回指向自动局部变量的指针无效
编译器应该发出警告:
[Warning] function returns address of local variable [enabled by default]
一种可能的解决方案是您可以将result
声明为
static int result;
然后你可以返回它的指针。
注意:代码中没有函数指针。
答案 2 :(得分:2)
结果变量仅在本地范围内可用。
你可以做的是:
#include<stdio.h>
#include<stdlib.h>
int * function1(int);
int * function2(int);
int main(void)
{
int * result1,* result2;
int val = 1000;
result1 = function1(val);
fprintf(stderr,"result1 = %d\n", *result1);
result2 = function2(val);
fprintf(stderr,"result2 = %d\n", *result2);
fprintf(stderr,"result1 = %d\n", *result1);
free(result2);
free(result1);
}
int * function1(int val)
{
int *result = malloc(sizeof(int));
*result = val + 1500;
return result;
}
int * function2(int val)
{
int *result = malloc(sizeof(int));
*result = val - 1500;
return result;
}
因此,通过这种方式,您将始终在变量中获得结果。
答案 3 :(得分:2)
result
变量在function1
和function2
中具有块范围。
因此,在执行function1
或function2
后,result
变量不再存在。