You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言:如何通过双指针在主函数打印函数内创建的数组值?

嘿,我来帮你拆解问题并给出修复方案~

问题根源分析

你的代码里有两个核心问题,导致main函数无法正常打印数组:

  1. 局部数组的生命周期问题
    你在madeVector里定义的vector是栈上的局部变量,当函数执行完毕返回时,这块栈内存会被系统回收。哪怕你拿到了它的指针,main函数再去访问这块地址的内容属于「未定义行为」,结果要么是乱码,要么直接崩溃。

  2. 双指针的传参错误
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:04:33