这个问题可能看起来非常简单,但是我如何在 c 中声明一个返回双精度数组的函数。例如
char myfunction(int a, int b)
{
...
char d[a][b];
...
return d;
}
但这似乎不起作用(如果响应可以避免“malloc”和“free”的用法,那么理解这些基本用法可能会更有帮助)
最好的,纽本
但这似乎不起作用(如果响应可以避免“malloc”和“free”的用法,那么理解这些基本用法可能会更有帮助)
好吧,你不能因为你提议返回一个一旦函数返回就无效的指针。该数组被声明为具有自动存储持续时间,因此,一旦函数返回,对它的所有引用都将无效。您不能从 C 中的函数返回数组。
如果您需要在函数中填充数据,则可以从函数中返回char**
一个malloc
。
char **foo(int cols, int rows) {
char **ret = malloc(rows * sizeof(char*));
if(!ret)
return ret;
for(int i = 0; i < rows; ++i) {
ret[i] = malloc(cols);
/* error checking again for malloc,
call free() on pointers 0...i upon failure.
memset to 0 if you like */
}
return ret;
}
您现在可以对返回值使用多维数组语法。
char **p = foo(10, 20);
// p[j] returns a pointer to char, p[j][k] returns a char
char elem = p[j][k];
在这种情况下,您无法避免 malloc 和 free。问题是通过声明
char d[a][b];
您直接在堆栈上分配一个数组,因此当您的函数返回时,数组被取消分配并且您返回的地址无效。
使用类似的东西:
char** myfunction(int a, int b) {
char** d = (char**)malloc(a * sizeof(char*));
if (d ! = NULL) {
for (int i = 0; i < b; i++) {
d[i] = (char*)malloc(sizeof(char));
if (d[i] == NULL) {
for (int j = 0; j < i; j++) {
free(d[j]);
}
free(d);
d = NULL;
break;
}
}
}
return d;
}
在 C 中,如果您希望一个函数创建一个数组并将其返回给它的调用者,您必须使用malloc
或另一个动态分配内存的函数(例如calloc
or realloc
)。然后,您可以返回指向该数组的指针。
char **make2dArray(int x, int y) {
int i;
char **array = calloc(x, sizeof(char*));
for(i = 0; i < x; i++) {
array[i] = calloc(y, sizeof(char));
}
return array;
}
另一方面,如果您只是需要修改数组的值,最好将数组作为参数并在原地修改。
void modify2dArray(int x, int y, char **array) {
int i, j;
for(i = 0; i < x; i++) {
for(j = 0; j < y; j++) {
array[i][j] = 1;
}
}
}
请记住,一旦您完成了动态分配的内存,请为每个分配调用 free :
void dealloc2dArray(int x, int y, char **array) {
int i;
for(i = 0; i < x; i++) {
free(array[i]);
}
free(array);
}
以下是使用这些函数的样子:
char **array = NULL;
array = make2dArray(5,6);
modify2dArray(5,6,array);
dealloc2dArray(5,6);
array = NULL;
请注意,动态分配函数(malloc
、calloc
和realloc
)可能会失败,返回 NULL。我没有在每次分配后检查 NULL 以节省空间,但确保分配成功通常是一种好习惯。
自 C99 以来,在 C 中,分配真实二维数组的正确方法,而不是其他答案中的仿真,是执行以下操作:
char (*array)[cols] = malloc(cols * rows);
如果你必须在一个函数中这样做,对我来说最简单的方法似乎是
void * foo(int cols, int rows) {
char (*ret)[cols] = malloc(rows * cols);
// do something with it
return ret;
}
调用它时,您必须更加小心地将维度赋予新变量
char (*array)[cols] = foo(cols, rows);
所有这些都具有一个优点,即一个简单malloc
的用于分配一个连续的对象,并且您只需要free
在最后进行一次调用即可释放内存。