如何在C语言中从函数返回指向数组的指针(Pointer-To-Array)
指向数组的指针(Pointer-To-Array)用法与函数返回问题解决
指向数组的指针是C语言中一个相对冷门的特性,它和“数组指针”(指向数组元素的指针)是不同概念,基础用法示例:
int arr[] = { 3, 5, 6, 7, 9 }; int (*arr_ptr)[5] = &arr; // arr_ptr是指向包含5个int元素的数组的指针 printf("[2]=%d", (*arr_ptr)[2]); // 输出6,等价于arr[2]
这个特性的一个实用场景是将动态分配的一维指针“还原”为指向数组的指针,方便以数组下标方式访问:
int *ptr = malloc(sizeof(int) * 5); int(*arr_ptr)[5] = (int(*)[5])ptr; // 强制转换类型 printf("[2]=%d", (*arr_ptr)[2]); // 可以像访问数组一样操作动态分配的内存
你尝试定义返回指向数组的指针的函数时失败,问题出在malloc返回值的类型转换上,以下是两种修正方案:
方案一:显式类型转换修正
原代码中malloc返回的void*直接赋值给int(*)[5]类型变量,在C89标准下需要显式强制转换,修正后代码:
int (*)[5] create_arr_5(void) { int(*arr_ptr)[5] = (int(*)[5])malloc(sizeof(int) * 5); return arr_ptr; }
方案二:用typedef简化类型声明
为提升代码可读性,建议用typedef定义指向数组的指针类型后再编写函数:
// 定义包含5个int的数组类型 typedef int IntArr5[5]; // 返回指向该数组类型的指针 IntArr5* create_arr_5(void) { IntArr5* arr_ptr = (IntArr5*)malloc(sizeof(IntArr5)); return arr_ptr; }
或者直接定义指向数组的指针类型:
typedef int (*IntArr5Ptr)[5]; IntArr5Ptr create_arr_5(void) { IntArr5Ptr arr_ptr = (IntArr5Ptr)malloc(sizeof(int) * 5); return arr_ptr; }
调用示例
使用修正后的函数可按如下方式操作:
#include <stdio.h> #include <stdlib.h> // 此处放入修正后的create_arr_5函数 int main() { int (*arr)[5] = create_arr_5(); if (!arr) { perror("malloc failed"); return 1; } // 赋值并访问 (*arr)[2] = 10; printf("[2]=%d\n", (*arr)[2]); free(arr); // 直接释放指针即可 return 0; }
内容的提问来源于stack exchange,提问作者gberth
相关产品推荐
相关产品推荐

