这是错误的:
int *create_array(int rows, int columns){
int array[rows][columns] = {0};
return array;
}
并且应该产生如下警告:
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]
由于您正在返回自动变量的地址,因此当相应函数终止时其生命周期结束。
您可以在main()
中声明双指针,将其通过函数传递,为其动态分配内存并返回该指针。或者您可以在main()
中创建数组,并将双指针传递给函数。
我想知道在堆上分配多维数组并传递它们的方法
要在堆上分配内存,您可以使用以下两种涉及指针的方法:
#include <stdio.h>
#include <stdlib.h>
int **get(int N, int M)
{
int i, **array;
array = malloc(N*sizeof(int *));
for(i = 0 ; i < N ; i++)
array[i] = malloc( M*sizeof(int) );
return array;
}
void getNoReturn(int*** array, int N, int M) {
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;
p = get(2, 5);
fill(p ,2, 5);
print(p, 2, 5);
freeArray(p ,2);
return 0;
}
选择最适合您风格的选项。