如何在C中从头文件中的函数返回多维字符数组

如何在C中从头文件中的函数返回多维字符数组,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我有一个主文件和一个头文件 在主文件中,我想从头文件的char函数返回一个2D char数组。我的char函数如下所示: char character_distribution(int length, char redistribution[length][2]) { char *buffer, distribution[256][2] = {0}; long lSize; struct Bar result = funct();

我有一个主文件和一个头文件

在主文件中,我想从头文件的char函数返回一个2D char数组。我的char函数如下所示:

char character_distribution(int length, char redistribution[length][2])
{
        char *buffer, distribution[256][2] = {0};
        long lSize;
        struct Bar result = funct();
        buffer = result.x;
        lSize = result.y;
        length = collect_character_distribution(buffer, lSize, distribution);
        reorganize_character_distribution(length, distribution, redistribution);

        return redistribution;
}
我的主要功能如下:

#include <stdio.h>
#include "character_distribution.h"

void main()
{
        int length;
        char distribution[length][2];
        distribution = character_distribution(length, distribution[length][2]);
        int a;
        for(a = 0; a < length; a++)
        {
                printf("%c\n", distribution[a][0]);
        }
}

如何解决此问题?

将签名更改为:

char** character_distribution(int length, char redistribution[length][2])
返回的是多维数组,而不是字符

void character_distribution(int length, char redistribution[][2])
{
    char *buffer, distribution[256][2] = {0};
    long lSize;
    struct Bar result = funct();
    buffer = result.x;
    lSize = result.y;
    length = collect_character_distribution(buffer, lSize, distribution);
    reorganize_character_distribution(length, distribution, redistribution);
}
int main()
{
    int length = 2; //initialize
    char distribution[length][2];
    character_distribution(length, distribution);
    int a;
    for(a = 0; a < length; a++)
    {
        printf("%c\n", distribution[a][0]);
    }

    return 0;
}
另一种方法是手动为函数中的2d数组分配内存并返回它

char** character_distribution(int length, char redistribution[][2]) {
     //use malloc to create the array and a for loop to populate it 
}

实际上不能从C函数返回数组。但是,您可以返回指向此类数组的指针。在这种情况下,正确的声明是:

char (*character_distribution(int length, char redistribution[][2]))[][2]
调整初始尺寸是没有必要的,而且我怀疑,它实际上不符合标准C(至少,像您在问题中所做的那样,用
长度调整它的尺寸,我觉得很可疑)。这是因为数组是通过引用隐式传递的(在本例中,是通过引用显式返回的),并且不需要知道第一个维度就可以计算给定了数组指针(和索引)的元素的地址

请注意,不应返回指向函数本地作用域的数组的指针,因为一旦函数返回,其存储将被释放(这样的指针将无效)

但是,您的问题表明您实际上不需要返回数组。由于数组无论如何都是通过引用传递的,因此更改传入的数组将导致调用方也可以看到的更改。您的代码可以编写为:

void character_distribution(int length, char redistribution[][2])
{
        char *buffer, distribution[256][2] = {0};
        long lSize;
        struct Bar result = funct();
        buffer = result.x;
        lSize = result.y;
        length = collect_character_distribution(buffer, lSize, distribution);
        reorganize_character_distribution(length, distribution, redistribution);
}

#包括
#包括“字符分布.h”
void main()
{
int length=256;//您需要初始化此。。。
字符分布[长度][2];
//这里不需要作业!:
字符分布(长度,分布/*[length][2]-删除此!*/);
INTA;
对于(a=0;a


(当然,这取决于您调用的其他各种函数是否按预期执行)。

您的函数需要为
char**
类型才能返回二维数组。此外,
length
在您的程序中未初始化。@ameyCU您当然不需要返回类型为
char**
来返回二维数组。在任何情况下,都不应从声明函数返回指向(非静态)函数局部变量的指针。@davmac在这里您可以看到,数组被传递给函数,复制被创建和修改,但最好返回它并将函数返回存储在调用函数的数组中。注意-数组未在被调用函数中声明。@ameyCU将结果作为指针存储在调用函数提供的数组中确实可以。但是该指针的类型不是
char**
。这不是指向数组的指针,而是指向指针的指针。它们不是一回事。正确的类型应该是
char*([2])
,即您可以像
char*(inarray[2])
那样声明参数。尝试将显式转换添加到char**:distribution=(char**)character\u distribution(……)多维数组与
char**
不同。添加显式转换从来都不是解决方案,你在没有演员阵容的情况下所犯的错误就是告诉你你做错了;解决方案是修复代码,而不是告诉编译器隐藏错误消息Lukas,我从头文件调用该函数。它不在同一个文件中。即使在这种情况下,这也会起作用,因为在调用函数时,您正在传递指向数组的指针,并且函数将在同一个数组上进行修改。您能简单解释一下函数应该做什么吗?我可能能够提供帮助,但根据您的代码,重新分发是传递的内容,它从未在函数中更改过,因此没有任何理由返回它。你能解释一下这个函数的作用吗?也许有更简单的方法我在回答中加了这样做的方法谢谢你的回答davmac。你能和我分享你的完整答案吗,包括两个完整的函数?谢谢你的完整答案。目前,我在调用分布参数上的character\u distribution时,在main函数上遇到了这个错误:警告:传递'character\u distribution'的参数2会使指针从整数变为非整数cast@yusuf现在修好了,对不起。当需要整个数组时,您试图传递数组的一个元素。@yusuf我没有,而且在任何情况下我都没有您的所有代码。我建议发布一个单独的问题,其中包含一个最小的可编译示例,如果您自己无法调试它,该示例将再现该问题。@yusuf,可能是这样,但我不知道在本文中“完美工作”是什么意思,因为我看不到它们的代码(您也没有描述它们的工作)。有点不对劲——这就是我能有意义地说的全部。
char (*character_distribution(int length, char redistribution[][2]))[][2]
void character_distribution(int length, char redistribution[][2])
{
        char *buffer, distribution[256][2] = {0};
        long lSize;
        struct Bar result = funct();
        buffer = result.x;
        lSize = result.y;
        length = collect_character_distribution(buffer, lSize, distribution);
        reorganize_character_distribution(length, distribution, redistribution);
}
#include <stdio.h>
#include "character_distribution.h"

void main()
{
        int length = 256;   // you need to initialise this...
        char distribution[length][2];
        // No assignment needed here!:
        character_distribution(length, distribution /* [length][2] - remove this! */);
        int a;
        for(a = 0; a < length; a++)
        {
                printf("%c\n", distribution[a][0]);
        }
}