在C语言中返回一个固定大小的数组

4
我希望有一个函数能够在C或C++中返回一个数组或指向数组的指针,执行以下操作:
double[][] copy(double b[][], int mx, int my, int nx, int ny)
{   
    double[nx][ny] a;
    int i,j;

    for(i = mx; i<= nx; ++i) 
         for(j = my; j<= ny; ++j) 
               a[i][j] = b[i][j];

    return a;   
}

void main(void){

    double A[2][3];
    double B[2][3] = {{1,2}{3,4}{5,6}};

    A = copy(B,0,0,1,2);        
}

2
在C++中,main函数必须返回int类型(在C语言中也是如此)。另外,如果使用C++,请使用std::array。你可以毫不担心地返回它。 - chris
6
在C语言中,除非将数组包装在结构体中,否则无法从函数中返回数组。仅此而已。 - Ed S.
1
C和C++不允许您像那样分配裸数组。您需要一些包含整个数组的结构体或类,这意味着硬编码大小。(或者在C++中,您可以使用std::vector<std::vector<int>>或创建一个“矩阵”类。) - cHao
1
请选择 C 或 C++。根据所选择的语言,会得到不同的答案。 - Ed Heal
2个回答

1
这是从函数中返回数组的正确方法如下:
#define NUM_ROWS (5)
#define NUM_COLS (3)

char **createCharArray(void)
{
    char **charArray = malloc(NUM_ROWS * sizeof(*charArray));
    for(int row = 0; row < NUM_ROWS; row++)
        charArray[row] = malloc(NUM_COLS * sizeof(**charArray));

    return charArray;
}

在这个例子中,可以像这样调用上述函数:
char **newCharArray = createCharArray();

"

newCharArray现在可以使用:

"
char ch = 'a';

for(int row = 0; row < NUM_ROWS; row++)
    for(int col = 0; col < NUM_COLS; col++)
        newCharArray[row][col] = ch++;

类似地,数组也可以作为参数传递给函数:

void freeCharArray(char **charArr)
{
    for(int row = 0; row < NUM_ROWS; row++)
        free(charArr[row]);
    free(charArr);
}

在这个语句中,charArray[row] = malloc(NUM_ROWS * sizeof(**charArray)); 为什么使用 NUM_ROWS? - Kaustav Ray
@KaustavRay 打错了,谢谢你发现了。 - Fiddling Bits

1
你可以像这样从你的复制函数中返回double**。
  double ** copy(double *src, int row, int col)
  {
    // first allocate the array with required size
    double **copiedArr = (double **) malloc(sizeof(double *)*row);

    for(int i=0;i<row;i++)
    {
       // create space for the inner array
       *(copiedArr+i) = (double *) malloc(sizeof(double)*col);
       for(int j=0; j<col; j++)
       {
         // copy the values from source to destination.
         *(*(copiedArr+i)+j) = (*(src+i+j));
       }
    }

    // return the newly allocated array.
    return copiedArr;
   }

调用此函数的方式如下。

double src[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
double **dest = copy(&src[0][0],3,3); //here is your new array

在这里,您需要将copy()的返回值分配给double**而不是double[][]。 如果尝试将返回值分配给数组,则会生成“不兼容类型”错误(detail)。
由于在堆上分配了copiedArray的内存,因此您必须负责清除内存。
void freemem(double **mem, int row)
  {
    for(int i=0;i<row; i++)
    {
      free(*(mem+i));
    }
    free(mem);
  }

我还想指出你示例代码中的一些错误:

  • main函数的返回类型应该是int。
  • 应该将return语句放在main函数的结尾处。
  • 无法返回栈分配的值,这往往会导致崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接