如何将2D数组返回到C中的函数?

我是一名Ruby程序员,最终为C开发代码生成。就像要求Limo拖着一辆20世纪60年代的卡车一样。 无论如何。

这是我认为应该工作,但不起作用。

float[][] pixels() { float x[][]= { {1,1},{2,2} }; return x } void drawLine(float x[][2]) { //drawing the line } //inside main drawLine(pixels()); 

我把头撞在桌子上试图让这个东西起作用。 请帮忙。

你可怜的东西。 在C中,指针和数组密切相关。 此外,您通常需要将数组的大小作为单独的变量传递。 让我们开始:

 #include  float** createArray(int m, int n) { float* values = calloc(m*n, sizeof(float)); float** rows = malloc(n*sizeof(float*)); for (int i=0; i 

谢谢大家的答案,更具体地说是对数组指针关系的详细解释。

我将数组封装在一个结构中

  struct point_group1 { float x[3]; float y[3]; }; struct point_group1 pixels(){ struct point_group1 temp; temp.x[0] = 0.0; temp.x[1] = 1.0; temp.x[2] = -1.0; temp.y[0] = 0.0; temp.y[1] = 1.0; temp.y[2] = 1.0; return temp; } struct point_group1 points1 = pixels(); axPoly(points1.x, points1.y ,3, 0.0); 

C/C++ ,当您将数组传递给函数时,它会衰减为指向数组第一个元素的指针。 因此,在pixels()函数中,您将返回堆栈分配变量的地址。 返回变量的地址不再有效,因为在pixels()返回时,堆栈分配的变量超出了范围。 因此,您应该为存储是动态的变量(即使用malloc,calloc)。

因此,对于二维数组,您可以使用float** arrayVariable; 。 此外,如果将其传递给函数,则应该警惕它具有的行数和列数。

 int rows, columns; float** pixels() { // take input for rows, columns // allocate memory from free store for the 2D array accordingly // return the array } void drawLine( float** returnedArrayVariable ) { //drawing the line } 

由于2Darrays正在自行管理资源,因此它应该使用free将资源返回到免费存储。

 float (*pixels(void))[2] { static float x[2][2]= { {1,1},{2,2} }; return x; } void drawLine(float (*x)[2]) { //drawing the line //x[0][0]; } //inside main drawLine(pixels()); 

最简单的方法可能是在main中声明float数组并且pixels只需填充它:

 #define PIXEL_X_SIZE 2 #define PIXEL_Y_SIZE 2 int pixels(float x[][PIXEL_X_SIZE], int len) { /* I don't know if you want the logic of this method to ever change, but this will be roughly equivalent to what you do above */ if (len < PIXEL_Y_SIZE) { /* the length of the passed array is too small, abort */ return -1; } x[0][0] = x[0][1] = 1; x[1][0] = x[1][1] = 2; return 0; } void drawLine(float x[][PIXEL_X_SIZE]) { /* this will work fine */ } int main() { float pixel_array[PIXEL_Y_SIZE][PIXEL_X_SIZE]; pixels(pixel_array, PIXEL_Y_SIZE); drawLine(pixel_array); } 

你也可以使用mallocfree并将你的像素存储在堆上,但如果像素arrays的数量越大,就没有必要,它只会增加额外的复杂性,以确保你的内存总是得到正确的分配和释放。