【发布时间】:2021-06-10 18:17:21
【问题描述】:
我对重新分级局部变量的return 感到困惑:变量、它的地址和使用指针的返回地址。
第一:
#include <stdio.h>
int returner(void);
int main(void)
{
printf("The value I got is = %d\n", returner());
return 0;
}
int returner(void)
{
int a = 10;
return a;
}
输出:
The value I got is = 10
返回的局部变量虽然在函数返回后应该超出范围,但它是如何工作的?
第二:
#include <stdio.h>
int *returner(void);
int main(void)
{
int *pointer = returner();
printf("The value I got is = %d\n", *pointer);
return 0;
}
int *returner(void)
{
int a = 10;
return &a;
}
输出:
Test.c: In function 'returner':
Test.c:15:12: warning: function returns address of local variable [-Wreturn-local-addr]
15 | return &a;
为什么地址没有返回,虽然返回的值和First sample一样?
第三:
#include <stdio.h>
int *returner(void);
int main(void)
{
int *pointer = returner();
printf("The value I got is = %d\n", *pointer);
return 0;
}
int *returner(void)
{
int a = 10;
int *ptr = &a;
return ptr;
}
输出:
The value I got is = 10
现在,这个方法如何返回局部变量的地址并打印它的正确值,尽管该变量应该在函数返回后超出范围/被销毁?
请解释这三种方法的工作原理。
【问题讨论】:
-
int a->static int a -
@alex01011 使用
static需要完全了解它的作用。我不会断章取意地放弃这样的建议。 -
它不是核物理。简单地看一下文档,他就能准确地理解它的作用。
-
这是未定义的行为。当变量超出范围时,C 不会擦除变量的值。
-
@stark 实际上是一个问题。根据port70.net/~nsz/c/c11/n1570.html#6.2.4:当指针指向(或刚刚过去)的对象到达其生命周期结束时,指针的值变得不确定。
标签: c function pointers return local-variables