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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 01:07:24