#include <stdio.h>
void func(){
int a;
a += 10;
printf("a的地址:%d\t", &a);
printf("a = %d\n", a);
}
int main(){
func();
func();
return 0;
}
为什么调用两次函数之后,打印出的a的地址是同一个,并且a的值竟然累加了,不是说局部变量的生命周期在函数结束时也跟着结束吗?难道第一次调完函数之后,a的内存不释放吗?结果如图

因为这些变量都是放在堆栈上(并且相同调用函数,变量的偏移地址也是一样的),中间没有调用别的函数,堆栈里面的数据没有被修改,所以结果还在那里,这很正常。
不知道你这个问题是否已经解决, 如果还没有解决的话:
- 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7774873
- 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:微信小程序C页面点击返回上一级按钮至A页面
- 除此之外, 这篇博客: C语言——遗忘知识点回忆记录中的 61. 在函数定义中,数组的形参 a 实际上是一个指针。当进行参数传递时,主函数传递的是数组 a 的基地址,数组元素本身不被复制。作为一种表示习惯,编译器允许在作为参数声明的指针中使用数组方括号。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
- 您还可以看一下 赵修湘老师的大数据环境下的关联规则挖掘课程中的 大数据环境下的关联规则挖掘A小节, 巩固相关知识点
- 以下回答来自chatgpt:
问题描述中提到调用函数两次,局部变量a的地址相同且值累加。根据代码提供的函数和问题描述的相关情况,以下是我对这个问题的解答:
根据提供的代码,我们可以看到定义了三个顺序表:La、Lb和Lc,以及相关的操作函数。对于问题描述中的局部变量a,根据代码中没有提到a,所以假设a是其他地方的变量,没有在问题描述的代码中给出。
根据问题描述中“我调用了一个函数两次,发现打印出的局部变量a的地址是相同的,并且a的值竟然累加了”的情况,我们可以得出以下猜测:
- “我调用了一个函数两次”可能是指调用了find_intersection函数两次。
- “局部变量a的地址是相同的,并且a的值竟然累加了”可能是指find_intersection函数中的指针变量pa或pb,并且累加的情况可能是因为调用了ListInsert函数。
为了验证这个猜测,我们可以做以下步骤:
- 通过在函数调用前后打印a的地址(如果可以获取到a的地址),确定a的地址是否在find_intersection函数中。
- 通过在find_intersection函数中打印指针变量pa或pb的地址和值,并观察是否发生了累加。
- 如果发生了累加,可以通过查看ListInsert函数的实现,分析为什么会有累加的情况。
请按照以上步骤操作并提供额外的代码和运行结果,以便进一步解答该问题。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^