返回C中的2D字符数组



我已经做得够多了,但我真的不明白。

以下是我想要做的:将一个2D char数组作为函数的输入,更改其中的值,然后返回另一个2D chararray。

就是这样。非常简单的想法,但这些想法在C.中并不容易奏效

任何能让我以最简单的形式开始的想法都会受到赞赏。谢谢

C不会从函数返回数组。

你可以做几件可能足够接近的事情:

  • 您可以将您的阵列封装在structreturn中。C从函数返回struct s。缺点是这可能是大量的内存来回复制:

    struct arr {
        int arr[50][50];
    }
    struct arr function(struct arr a) {
        struct arr result;
        /* operate on a.arr[i][j]
           storing into result.arr[i][j] */
        return result;
    }
    
  • 您可以向数组返回指针。此指针必须指向使用malloc(3)为数组分配的内存。(或者另一个不从堆栈中分配内存的内存分配原语。(

    int **function(int param[][50]) {
        int arr[][50] = malloc(50 * 50 * sizeof int);
        /* store into arr[i][j] */
        return arr;
    }
    
  • 您可以对传递到函数中的数组指针进行操作,并就地修改输入数组。

    void function(int param[][50]) {
        /* operate on param[i][j] directly -- destroys input */
    }
    
  • 您可以将参数用作"输出变量",并使用它来"返回"新数组。如果您希望调用程序分配内存,或者如果您希望指示成功或失败,这是最好的:

    int output[][50];
    int function(int param[][50], int &output[][50]) {
        output = malloc(50 * 50 * sizeof int);
        /* write into output[i][j] */
        return success_or_failure;
    }
    

    或者,由调用者分配:

    int output[50][50];
    void function(int param[][50], int output[][50]) {
        /* write into output[i][j] */
    }
    

不能从函数返回数组。

你有几个选择:

  • 将数组包裹在结构中
结构wraparray{int数组[42][42];};结构wraparray foobar(void({结构wraparray ret={0};回流管;}
  • 将目标数组作为指向其第一个元素(及其大小(的指针传递给函数;并更改数组
int foobar(int*dst,size_trows,size_tcols,const int*src({size_t len=行*cols;while(len--({*dst++=42+*src++;}返回0;/*好的*/}//示例用法int x[42][42];int y[42][42];foobar(x[0],42,42,y[0](;
  • 更改原始数组
int foobar(int*arr,size_trows,size_tcols({size_t len=行*cols;而(len-(*arr++=0;返回0;/*好的*/}
char **foo(const char * const * bar, size_t const *bar_len, size_t len0) {
    size_t i;        
    char** arr = malloc(sizeof(char *) * len0);
    for (i = 0; i < len0; ++i) {
        arr[i] = malloc(bar_len[i]);
        memcpy(arr[i], bar[i], bar_len[i]);
    }
    /* do something with arr */
    return arr;
}

代码中的其他位置:

char **pp;
size_t *pl;
size_t ppl;
/* Assume pp, pl are valid */
char **pq = foo(pp, pl, ppl);
/* Do something with pq */
/* ... */
/* Cleanup pq */
{
    size_t i;
    for (i = 0; i < ppl; ++i)
        free(pq[i]);
    free(pq);
} 

因为你是通过指针而不是通过值传递的,并且你想写入输入数组,所以你必须复制它

下面是另一个例子。测试并工作。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void test(char**,unsigned int,unsigned int);
const unsigned int sz_fld = 50 + 1;
const unsigned int sz_ffld = 10;
int main(void) {
    char fld[sz_ffld][sz_fld];
    for (unsigned char i=0;i<sz_ffld;++i) {
        strcpy(fld[i],"");
    }
    strcpy(fld[0],"one");
    strcpy(fld[1],"two");
    strcpy(fld[2],"three");
    char** pfld = malloc(sz_ffld*sizeof(char*));
    for (unsigned int i=0;i<sz_ffld;++i) {
        *(pfld+i) = &fld[i][0];
    }
    test(pfld,sz_ffld,sz_fld);
    printf("%sn",fld[0]);
    printf("%sn",fld[1]);
    printf("%sn",fld[2]);
    free(pfld);
    return(0);
}
void test(char** fld,unsigned int m,unsigned int n) {
    strcpy(*(fld+0),"eleven");
    strcpy(*(fld+1),"twelve");
    return;
}

注意以下内容:

对于编译,我使用带有C99选项的gcc。

我定义了包含两个大小信息的函数,但我编写了非常基本的代码,实际上根本没有使用这些信息,只有strcpy((,所以这在任何方面都不是安全的代码(尽管我显示了这种功能的"m"one_answers"n"(。它只是展示了一种制作静态2D字符数组的技术,并通过指向数组"字符串"的指针数组的中间部分在函数中使用它。

当您将2D数组作为参数传递给函数时,您需要显式地告诉它数组的大小二维

void MyFunction(array2d[][20]) { ... }

以下内容将满足您的需要。它将打印"一"one_answers"十"。还要注意的是,它是按10和8的精确数组尺寸键入的。

char my_array[10][8] = 
{
{"One"},
{"Two"},
{"One"},
{"One"},
{"One"},
{"One"},
{"One"},
{"One"},
{"Nine"},
{"Ten"},
};
void foo ( char (**ret)[10][8] )
{
  *ret = my_array;
}
void main()
{
  char (*ret)[10][8];
  foo(&ret);
  printf("%srn", (*ret)[0] )
  printf("%srn", (*ret)[9] )
}

最初的问题是关于返回数组,所以我更新它以显示返回值。你不能直接"返回一个数组",但你可以制作一个数组的typedef并返回。。。

char my_array[10][8];
typedef char ReturnArray[8];
ReturnArray* foo()
{
  return my_array;
}

相关内容

  • 没有找到相关文章