从C中的函数返回多维数组

Nia*_*lJG 5 c arrays pointers function multidimensional-array

从c中的函数返回多维数组的最佳方法是什么?

说,我们需要一个函数生成多维数组并调用它的主,是它最好能包住它在一个结构或只返回一个指向内存堆?

 int *create_array(int rows, int columns){
     int array[rows][columns] = {0};
     return array;
 }

 int main(){

     int row = 10;
     int columns = 2;
     create_array(row,columns); 
 }
Run Code Online (Sandbox Code Playgroud)

上面的代码,只是为了勾勒出我想到的基本程序.

gsa*_*ras 6

这是错误的:

int *create_array(int rows, int columns){
     int array[rows][columns] = {0};
     return array;
}
Run Code Online (Sandbox Code Playgroud)

并且应该产生这样的警告:

prog.c:2:6: note: (near initialization for 'array')
prog.c:3:13: warning: return from incompatible pointer type [-Wincompatible-pointer-types]
      return array;
             ^~~~~
prog.c:3:13: warning: function returns address of local variable [-Wreturn-local-addr]
Run Code Online (Sandbox Code Playgroud)

因为您要返回一个自动变量的地址;当其对应的函数终止时,它的生命周期就结束了。


您应该在 中声明一个双指针main(),将其传递给函数,为其动态分配内存并返回该指针。或者您可以在其中创建数组main()并将双指针传递给函数。


我想知道在堆上分配多维数组并传递它们的方法

要在堆上分配内存,您可以使用以下两种方法之一,它们涉及指针

#include <stdio.h>
#include <stdlib.h>

// We return the pointer
int **get(int N, int M) /* Allocate the array */
{
    /* Check if allocation succeeded. (check for NULL pointer) */
    int i, **array;
    array = malloc(N*sizeof(int *));
    for(i = 0 ; i < N ; i++)
        array[i] = malloc( M*sizeof(int) );
    return array;
}

// We don't return the pointer
void getNoReturn(int*** array, int N, int M) {
    /* Check if allocation succeeded. (check for NULL pointer) */
    int i;
    *array = malloc(N*sizeof(int *));
    for(i = 0 ; i < N ; i++)
        (*array)[i] = malloc( M*sizeof(int) );
}

void fill(int** p, int N, int M) {
    int i, j;
    for(i = 0 ; i < N ; i++)
        for(j = 0 ; j < M ; j++)
            p[i][j] = j;
}

void print(int** p, int N, int M) {
    int i, j;
    for(i = 0 ; i < N ; i++)
        for(j = 0 ; j < M ; j++)
            printf("array[%d][%d] = %d\n", i, j, p[i][j]);
}

void freeArray(int** p, int N) {
    int i;
    for(i = 0 ; i < N ; i++)
        free(p[i]);
    free(p);
}

int main(void)
{
    int **p;
    //getNoReturn(&p, 2, 5);
    p = get(2, 5);
    fill(p ,2, 5);
    print(p, 2, 5);
    freeArray(p ,2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

选择最适合您的风格。