【问题标题】:return 2D array from C function从 C 函数返回二维数组
【发布时间】:2021-03-29 12:42:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在这种情况下,将指针作为 void * 指针返回,然后在调用者中将其分配给 char ( * )[c] 类型的指针。

标签: c multidimensional-array return-type function-declaration variable-length-array


【解决方案1】:

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 = 3;
    
    char ( *p )[c] = f( r, 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];

【讨论】:

  • 非常感谢。所以我总是要使用char(*p)[c] = f( r, c ); c 值必须在= 符号的两边?有没有其他/更好的方法来避免c value on both sides
  • @CoR 您正在动态分配 char[r][c] 类型的可变长度数组。因此,指向数组元素(行)的指针具有 char ( * )[c] 类型,您应该使用它来访问数组元素,如第二个演示程序中所示。
  • @CoR:您可以避免将cchar (*p)[c] = f(r, sizeof *p / sizeof **p); 重复。这避免了重复,这对于避免错误通常是一件好事,但它确实增加了混乱。通常有一个宏来提供数组元素的数量:#define NumberOf(x) (sizeof (x) / sizeof *(x))。然后你可以写char (*p)[c] = f(r, NumberOf(*p));。根据情况,专家可能会使用这种方法来保持代码有序,但对于新手来说可能不熟悉和困惑。
猜你喜欢
  • 2021-05-01
  • 2021-12-04
  • 2014-12-19
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 2011-07-09
相关资源
最近更新 更多