C语言:如何通过双指针在主函数打印函数内创建的数组值?
嘿,我来帮你拆解问题并给出修复方案~
问题根源分析
你的代码里有两个核心问题,导致main函数无法正常打印数组:
局部数组的生命周期问题
你在madeVector里定义的vector是栈上的局部变量,当函数执行完毕返回时,这块栈内存会被系统回收。哪怕你拿到了它的指针,main函数再去访问这块地址的内容属于「未定义行为」,结果要么是乱码,要么直接崩溃。双指针的传参错误
C语言的参数传递是「值传递」,你传递的pp只是一个副本到函数里的occurr参数。你修改occurr = &pOccurr只是修改了副本的指向,完全不会影响main函数里原本的pp变量。要修改main里的双指针,你需要传递它的地址(也就是用三级指针接收)。
修复方案1:使用动态内存分配(推荐)
用malloc在堆上分配内存,这样内存不会随函数结束释放,需要手动调用free避免泄漏:
#include <stdio.h> #include <stdlib.h> void madeVector(int ***occurr){ // 动态分配5个int大小的内存 int *vector = malloc(5 * sizeof(int)); if (vector == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } // 给数组赋值 for(int i = 0; i < 5; i++){ vector[i] = i + 1; } // 修改main里的pp,让它指向这个动态数组的指针 *occurr = &vector; printf("\n--==[Inside Function]==--\n\n"); for(int i = 0; i < 5; i++){ printf(" %i", *(*(*occurr) + i)); } printf("\n\n"); } int main() { int **pp; // 传递pp的地址,让函数能修改它 madeVector(&pp); printf("\n--==[Outside Function]==--\n\n"); for(int i = 0; i < 5; i++){ printf(" %i", *(*pp + i)); // 也可以写成pp[0][i],更直观 } printf("\n\n"); // 记得释放堆内存,避免泄漏 free(*pp); pp = NULL; return 0; }
修复方案2:使用静态数组(简单场景适用)
把vector改成静态数组,它会存储在全局数据区,生命周期和程序一致,不用手动释放,但注意多次调用函数时会共享这个数组:
#include <stdio.h> #include <stdlib.h> void madeVector(int ***occurr){ static int vector[] = {1, 2, 3, 4, 5}; int *pOccurr = vector; *occurr = &pOccurr; printf("\n--==[Inside Function]==--\n\n"); for(int i = 0; i < 5; i++){ printf(" %i", *(*(*occurr) + i)); } printf("\n\n"); } int main() { int **pp; madeVector(&pp); printf("\n--==[Outside Function]==--\n\n"); for(int i = 0; i < 5; i++){ printf(" %i", *(*pp + i)); } printf("\n\n"); return 0; }
简化方案:直接返回一级指针(更简洁)
如果你的需求只是返回一个数组的指针,完全没必要用双指针绕圈子,直接返回一级指针更清晰:
#include <stdio.h> #include <stdlib.h> int* madeVector(){ int *vector = malloc(5 * sizeof(int)); if (vector == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } for(int i = 0; i < 5; i++){ vector[i] = i + 1; } printf("\n--==[Inside Function]==--\n\n"); for(int i = 0; i < 5; i++){ printf(" %i", vector[i]); } printf("\n\n"); return vector; } int main() { int *p = madeVector(); printf("\n--==[Outside Function]==--\n\n"); for(int i = 0; i < 5; i++){ printf(" %i", p[i]); } printf("\n\n"); free(p); p = NULL; return 0; }
内容的提问来源于stack exchange,提问作者eddiesaliba
相关产品推荐
相关产品推荐

