C语言 如何从C中的函数返回二维数组?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5201708/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to return a 2D array from a function in C?
提问by Eastern Monk
I am a Ruby programmer who has ended up developing a code generate for C. Its like asking a Limo to tow a 1960s truck. Any way.
我是一名 Ruby 程序员,最终为 C 开发了代码生成。这就像让一辆豪华轿车拖走 1960 年代的卡车。反正。
Here is what I thought should work but doesnt work.
这是我认为应该起作用但不起作用的方法。
float[][] pixels()
{
float x[][]= { {1,1},{2,2} };
return x
}
void drawLine(float x[][2])
{
//drawing the line
}
//inside main
drawLine(pixels());
I have banged my head on my desk trying to get this thing work. Please help.
我把头撞在桌子上,试图让这件事发挥作用。请帮忙。
采纳答案by Eastern Monk
Thank you all for your answers and more specifically for the detailed explanation of the array-pointer relationship.
感谢大家的回答,特别是对数组指针关系的详细解释。
I encapsulated the array in a structure
我将数组封装在一个结构中
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);
回答by aschepler
You poor thing. In C, pointers and arrays are closely related. Also, you usually need to pass the size of an array as a separate variable. Let's start you with:
你这个可怜的东西。在 C 中,指针和数组密切相关。此外,您通常需要将数组的大小作为单独的变量传递。让我们从你开始:
#include <stdio.h>
float** createArray(int m, int n)
{
float* values = calloc(m*n, sizeof(float));
float** rows = malloc(n*sizeof(float*));
for (int i=0; i<n; ++i)
{
rows[i] = values + i*m;
}
return rows;
}
void destroyArray(float** arr)
{
free(*arr);
free(arr);
}
void drawLine(const float** coords, int m, int n);
int main(void)
{
float** arr = createArray(2,2);
arr[0][0] = 1;
arr[0][1] = 1;
arr[1][0] = 2;
arr[1][1] = 2;
drawLine(arr, 2, 2);
destroyArray(arr);
}
回答by Eunice
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());
回答by Mahesh
In C/C++, when you pass an array to a function, it decays to be a pointer pointing to first element of the array. So, in pixels()function, you are returning the address of a stack allocated variable. The returning variable's address is no longer valid because on pixels()return, the stack allocated variable goes out of scope. So, instead you should for a variable whose storage is dynamic ( i.e., using malloc, calloc ).
在 中C/C++,当您将数组传递给函数时,它会衰减为指向数组第一个元素的指针。因此,在pixels()函数中,您正在返回堆栈分配变量的地址。返回变量的地址不再有效,因为在pixels()返回时,堆栈分配的变量超出范围。因此,您应该使用动态存储的变量(即,使用 malloc、calloc)。
So, for a two dimensional array, you may use float** arrayVariable;. Also, if you passing this to a function, you should be wary of how many rows & columns it has.
因此,对于二维数组,您可以使用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
}
Since, 2D array is managing resources it self, it should return the resources back to the free store using free.
由于 2D 数组自己管理资源,因此它应该使用free将资源返回到免费存储。
回答by user470379
The easiest way is probably going to be declaring the floatarray in main and having pixelsjust fill it:
最简单的方法可能是float在 main 中声明数组并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);
}
You can also use mallocand freeand store your pixels on the heap, but if this is all the bigger the pixels array is going to be, there's really no need and it just adds additional complexity to make sure your memory always get properly allocated and freed.
您还可以在堆上使用malloc和free存储像素,但如果像素数组将变得更大,则实际上没有必要,它只会增加额外的复杂性,以确保您的内存始终得到正确分配和释放。

