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

如何向函数传递指针?如何传递p[0]并打印其内容?

问题解答

问题1:如何向函数传递指针?

向函数传递指针主要有几种常见方式:

  • 直接传递指针变量:函数参数定义为int *ptr这类指针类型,调用时传入变量的地址(如&var)或已有的指针变量。
  • 传递指针数组:像你代码里的int *p[]作为参数,本质等同于int **p(指向指针的指针),调用时直接传入指针数组的名称即可。
  • 传递指针的地址:如果需要在函数内部修改指针本身的指向,就要传递指针的地址,比如函数参数是void func(int **pp),调用时传入&ptr。

问题2:如何将p[0]传递给函数并打印它的内容?

你代码里传递p[0]的语法是正确的,但p[0]指向了已经失效的内存,导致无法正常输出。先排查代码核心问题,再看修复后的实现:

代码问题根源与修复

你的代码出现异常的核心原因是局部数组的生命周期问题:setupMidiOctave函数里定义的a和b是局部自动变量,当函数执行完毕返回后,这些变量占用的内存会被系统回收,此时p[0]和p[1]就变成了野指针,访问野指针指向的内容属于未定义行为,可能导致无输出、乱码或程序崩溃。

下面提供三种修复方案:

方案1:将局部数组改为静态数组

用static修饰局部数组,使其内存分配在静态存储区,函数结束后不会被释放:

#include "stdio.h"
    
void setupMidiOctave(int *p[]) {
    static int a[] = {1, 2, 3};
    static int b[] = {4, 5, 6};

    p[0] = a; // 数组名本身就是首元素地址,等价于&a[0]
    p[1] = b;
}

void prt(int *a) {
    printf("%d\n", a[1]);
}

int main(void) {
    int *p[2];
    setupMidiOctave(p);
    printf("%d\n", p[0][0]); // 输出1
    prt(p[0]); // 输出2
    return 0;
}

方案2:在主函数中分配数组内存

让指针数组指向主函数中的数组,这些数组的生命周期和main函数一致:

#include "stdio.h"
    
void setupMidiOctave(int *p[]) {
    p[0][0] = 1;
    p[0][1] = 2;
    p[0][2] = 3;
    p[1][0] = 4;
    p[1][1] = 5;
    p[1][2] = 6;
}

void prt(int *a) {
    printf("%d\n", a[1]);
}

int main(void) {
    int a[3], b[3];
    int *p[2] = {a, b};
    setupMidiOctave(p);
    printf("%d\n", p[0][0]); // 输出1
    prt(p[0]); // 输出2
    return 0;
}

方案3:使用动态内存分配

通过malloc分配堆内存,需要手动释放避免内存泄漏:

#include "stdio.h"
#include "stdlib.h"
    
void setupMidiOctave(int *p[]) {
    int *a = malloc(3 * sizeof(int));
    int *b = malloc(3 * sizeof(int));
    if (a && b) {
        a[0] = 1; a[1] = 2; a[2] = 3;
        b[0] = 4; b[1] = 5; b[2] = 6;
        p[0] = a;
        p[1] = b;
    }
}

void prt(int *a) {
    printf("%d\n", a[1]);
}

int main(void) {
    int *p[2];
    setupMidiOctave(p);
    printf("%d\n", p[0][0]); // 输出1
    prt(p[0]); // 输出2
    // 释放动态分配的内存
    free(p[0]);
    free(p[1]);
    return 0;
}

内容的提问来源于stack exchange,提问作者user2315546

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:52:27