如何在C语言的void函数中为指针参数分配新值?
问题分析与解决方案
你的代码存在两个核心问题:
- 函数
function的参数是值传递的一级指针,你在函数内修改的只是形参的地址,完全不会影响main里的指针变量本身; val1、val2是函数栈上的局部变量,函数执行完毕后会被销毁,就算你修改指针成功,main里访问的也是已释放的内存,属于未定义行为。
下面提供两种可行的解决思路:
方案一:用二级指针修改指针本身(推荐)
如果需要让main里的指针指向新的内存地址,必须用指向指针的指针作为函数参数,这样才能直接修改main中的指针变量:
#include <stdio.h> #include <stdlib.h> #include <errno.h> void function(int **c1, int **c2){ // 动态分配堆内存,避免局部变量销毁的问题 *c1 = malloc(sizeof(int)); *c2 = malloc(sizeof(int)); // 检查内存分配是否成功 if(*c1 == NULL || *c2 == NULL){ perror("内存分配失败"); return; } // 给新分配的内存赋值 **c1 = 1; **c2 = 2; } int main(){ int *c1 = NULL, *c2 = NULL; function(&c1, &c2); // 检查指针是否有效后再访问 if(c1 != NULL && c2 != NULL){ printf("*c1=%d, *c2=%d\n", *c1, *c2); } // 记得释放堆内存,避免泄漏 free(c1); free(c2); return 0; }
方案二:提前分配内存,直接修改指针指向的内容
如果不需要修改指针本身,只是要更新指针指向的数值,可以提前在main里给指针分配有效内存(栈或堆),函数内直接修改内存内容:
#include <stdio.h> #include <stdlib.h> void function(int *c1, int *c2){ // 直接修改指针指向的内存值 *c1 = 1; *c2 = 2; } int main(){ // 方式1:用栈上的局部变量(无需手动释放) int val1, val2; int *c1 = &val1, *c2 = &val2; // 方式2:用堆内存(需要手动free) // int *c1 = malloc(sizeof(int)); // int *c2 = malloc(sizeof(int)); // if(c1 == NULL || c2 == NULL){ // perror("内存分配失败"); // return 1; // } function(c1, c2); printf("*c1=%d, *c2=%d\n", *c1, *c2); // 如果用了堆内存,记得释放 // free(c1); // free(c2); return 0; }
关于你之前内存分配失败的原因
你应该是直接在function里给形参c1分配了内存,但形参是局部变量,修改后不会同步到main的实参里,main里的指针还是NULL或野指针,访问自然会出错。
内容的提问来源于stack exchange,提问作者p b
相关产品推荐
相关产品推荐

