从 C 函数返回二维数组

问题描述

灵感来自 this 问题。我创建了这个函数:

char** char2Da (int r,int c) {

    char (*p)[c] = malloc(sizeof(char[r][c]));
    // come code filling 2D array
    return (char**) p;
}

不幸的是它不起作用。为什么?是否可以在 C 中返回指向二维数组的指针并使用上面的方法保留 [][] 符号?如果不是,为什么?我在这里错过了什么?
我知道有一种解决方法是创建外部数组,通过 ref 将其传递给函数。但它有点难看,我很想将所有内容都封装在一个函数中。

请记住,我有 PHP 和 JavaScript 背景,您只需创建 arr[][] 并从函数中返回它。不客气。

解决方法

类型 char **char ( * )[c] 是不同的类型。例如,取消引用 char ** 类型的第一个指针,您将获得存储在已分配数组的第一行的第一个字符中的值,该值不是指针。

您可以通过以下方式完成任务

void * char2Da (int r,int c) {

    char (*p)[c] = malloc(sizeof(char[r][c]));
    // come code filling 2D array
    return p;
}

然后在调用者中写入

char ( *p )[c] = char2Da( r,c );

这是一个演示程序

#include <stdio.h>
#include <stdlib.h>

void * f( size_t r,size_t c )
{
    char ( *p )[c] = malloc( sizeof( char[r][c] ) );
    
    return p;
}


int main(void) 
{
    size_t r = 2,c = 3;
    
    char ( *p )[c] = f( r,c );
    
    free( p );
    
    return 0;
}

或者其他示范程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void * f( size_t r,size_t c )
{
    char ( *p )[c] = malloc( sizeof( char[r][c] ) );

    char value = 'A';
    
    for ( size_t i = 0; i < r; i++ )    
    {
        memset( p[i],value++,c );
        p[i][c-1] = '\0';
    }
    
    return p;
}


int main(void) 
{
    size_t r = 2,c );
    
    for ( size_t i = 0; i < r; i++ ) puts( p[i] );
    
    free( p );
    
    return 0;
}

程序输出为

AA
BB

如果 c 是一个编译时常量,并且您没有分配可变长度数组,那么函数声明可能看起来像

#define C 10

char ( *char2Da (int r ) )[C];

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...