为何将变量地址传递给函数后,函数内修改的值在主函数不生效?
问题分析与解决
你的代码问题出在指针参数的使用方式错误,以及局部变量的生命周期问题:
核心错误点
- 修改了指针形参本身,而非指向的内存
函数waiter中的result_count是形参,它是main函数传入的&result_count的一个副本。你执行result_count = &t;只是改变了这个副本指针的指向,完全没有修改main函数中result_count变量的内存值。函数内打印的是局部变量t的值,但main里的变量根本没被改动。 - 局部变量
t的生命周期问题
就算你想让main里的指针指向t,t是函数内的局部变量,函数执行结束后会被销毁,此时指向它的指针会变成野指针,访问会触发未定义行为。
正确的修改方式
要修改main函数中result_count的值,应该通过解引用指针,直接往它指向的内存地址写入值:
#include<stdio.h> // 先声明函数,避免隐式声明问题 int* waiter(int number_count, int* number, int q, int* result_count); int main() { int result_count; // 需确保n、number、q已提前定义 int* result = waiter(n, number, q, &result_count); printf("%d", result_count); // 现在会打印10 } int* waiter(int number_count, int* number, int q, int* result_count) { int t = 10; // 解引用指针,修改main中变量的实际值 *result_count = t; printf("%d", *result_count); // 打印10 // 返回合法指针,避免编译警告,示例返回NULL return NULL; }
额外说明
- 函数必须在调用前声明或定义,否则C编译器会默认它返回
int类型,和你实际返回的int*类型不匹配,会产生编译错误。 - 若需返回动态数组或指针,需用
malloc等函数分配堆内存,避免返回局部变量的指针(野指针问题)。
内容的提问来源于stack exchange,提问作者sam907
相关产品推荐
相关产品推荐

