如何向函数传递指针?如何传递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
相关产品推荐
相关产品推荐

