Arrays 访问在C中作为指针返回的2D数组

Arrays 访问在C中作为指针返回的2D数组,arrays,c,pointers,Arrays,C,Pointers,我试图从函数返回一个2D数组。我试过一些网站上提到的方法。但他们无能为力。最后,我分配了一个指向2D数组的指针,并从函数返回它。下面给出了示例函数的代码 float *test(int *x, int *y) { static float res[2][3]; float[] temp = {1,2,3}; for(int i=0;i<3;i++) res[0][i] = temp[i]; for(int i=0;i<3;i++) res[1][i]

我试图从函数返回一个2D数组。我试过一些网站上提到的方法。但他们无能为力。最后,我分配了一个指向2D数组的指针,并从函数返回它。下面给出了示例函数的代码

float *test(int *x, int *y)
{
    static float res[2][3];
    float[] temp = {1,2,3};
    for(int i=0;i<3;i++) res[0][i] = temp[i];
    for(int i=0;i<3;i++) res[1][i] = temp[i]*-1;
    float *ptr = &res[0][0];
    return ptr;
}
float*测试(int*x,int*y)
{
静态浮点数[2][3];
float[]temp={1,2,3};

对于(int i=0;i您可以返回指向静态变量的指针:

char (*modify(char input))[3] 
{
  static char variable[3][3];
  variable[0][0] = input;
  variable[1][1] = input+1;
  return variable;
}

int main() {
    char (*result)[3] = modify(a);
}
但是,这不是一个可重入函数。另一个选项是使用动态内存(即malloc),但当返回指向已分配内存的指针时,内存泄漏是很常见的


另一种方法是将数组传递给已分配的函数,这样就不必担心释放内存或使用静态:

void modify(char variable[][3], char input) {
    variable[0][0] = input;
    variable[1][1] = input+1;
}

int main(void) {
    char result[3][3];
    modify(result,a);
}
更好的方法是创建一个typedef,以突出目的、长度,并使使用它更容易:

typedef struct { char x[3][3]; } my2D_t;

void modify(my2D_t *variable, char input) {
    variable->x[0][0] = input;
    variable->x[1][1] = input+1;
}
int main() {
    my2D_t result;
    char a = 1;
    modify(&result,a);
}
正如tstanisl所注意到的那样,它也会按值返回。它会创建另一个
my2D\u t
,但编译器可能会得到与前面想法类似的东西,以便进行优化,称为“仿佛”规则:


您必须通过动态分配
malloc
来完成此操作。 考虑这个代码:

float **result = NULL; // if you want to return 2D array you need double pointer
result = (float **)malloc(2 * sizeof(float *)); // allocating assuming that the allocating will not fail otherwise it return NULL
for(int i = 0; i < 2; i++)
    result[i] = (float *)malloc(3 * sizeof(float));

for(int i = 0; i < 3; i++) result[0][i] = i;
for(int i = 0; i < 3; i++) result[1][i] = i * -1;
return result;

正确声明函数的返回类型,然后只返回静态数组:

float (*test(int *x, int *y))[3]
{
    static float res[2][3];
    float temp[] = {1,2,3};
    for(int i=0;i<3;i++) res[0][i] = temp[i];
    for(int i=0;i<3;i++) res[1][i] = temp[i]*-1;
    return res;
}
float(*测试(int*x,int*y))[3]
{
静态浮点数[2][3];
浮动温度[]={1,2,3};

对于(int i=0;iSee@JohnBollinger是的,你是对的。我错了。我的问题是,你是否希望返回一个可用的对象,就好像它是一个具有固定维度的数组一样,如示例代码中所示,或者至少是一个固定的第二维度?这会产生不同,并且未使用的参数
x
y
的存在让我怀疑你的示例可能无法代表您真正想要的内容。请注意,您可以按值返回“my2D\u t”
for(int i=0;i<3;i++) free(result[i]); //done in main
free(result);
float (*test(int *x, int *y))[3]
{
    static float res[2][3];
    float temp[] = {1,2,3};
    for(int i=0;i<3;i++) res[0][i] = temp[i];
    for(int i=0;i<3;i++) res[1][i] = temp[i]*-1;
    return res;
}
float (*test(int *x, int *y))[3]
{
    float (*res)[3] = malloc(2 * sizeof *res);
    float temp[] = {1,2,3};
    for(int i=0;i<3;i++) res[0][i] = temp[i];
    for(int i=0;i<3;i++) res[1][i] = temp[i]*-1;
    return res;
}