[英]How to return a 2D array from a function in C?
我是一名 Ruby 程序员,最终为 C 开发了代码生成。这就像让一辆豪华轿车拖走 1960 年代的卡车。 反正。
这是我认为应该起作用但不起作用的方法。
float[][] pixels()
{
float x[][]= { {1,1},{2,2} };
return x
}
void drawLine(float x[][2])
{
//drawing the line
}
//inside main
drawLine(pixels());
我把头撞在桌子上,试图让这件事发挥作用。 请帮忙。
你这个可怜的东西。 在 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);
}
在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
}
由于 2D 数组自己管理资源,因此它应该使用free将资源返回到免费存储。
感谢大家的回答,特别是对数组指针关系的详细解释。
我将数组封装在一个结构中
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);
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);
}
您还可以使用malloc
和free
并将您的像素存储在堆上,但如果像素数组将变得更大,则实际上没有必要,它只会增加额外的复杂性以确保您的内存始终得到正确分配和获释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.