函数与C中的返回类型数组

我在C中有以下function:

int[] function(int a){ int * var = (int*)malloc(sizeof(int)*tags); .... } 

*var是指向数组var的指针吗?

如果是,我如何在函数中返回数组( var )?

你不能真正从函数返回一个数组,而是一个指针:

 int * function(int a){ int * var = malloc(sizeof(int)*tags); //.... return var; } 

下面的代码可以澄清数组和指针的工作原理。 该函数将为“tags”int变量分配内存,然后它将使用数字初始化每个元素并返回指向数组的内存段。 从main函数我们将循环并打印数组元素,然后我们将释放不再需要的内存。

 #include  #include  int *function(unsigned int tags) { int i; int *var = malloc(sizeof(int)*tags); for (i=0; i < tags; i++) { var[i] = i; } return var; } int main() { int *x; int i; x = function(10); for (i=0; i < 10; i++) { printf("TEST: %i\n", x[i]); } free(x); x=NULL; return 0; } 

在C中,函数不能返回数组类型。 出于您的目的,您希望返回指向int的指针:

 int *function(int a) { int *var = malloc(sizeof *var * tags); // where is tags defined? // are you sure you don't mean a here? ... return var; } 

这将分配一个足够大的内存块来保存tags整数值,并将该块的第一个元素的地址分配给var 。 请注意, var是指向int的指针,而不是指向int数组的指针。 该指针是从函数返回的。

您可以在指针表达式上使用下标oprerator,就像它是一个数组一样,如下所示:

 int a = ...; int *arr = function(a); ... arr[0] = 0; arr[1] = 1; ... 

arr是一个指针表达式,而不是一个数组表达式,因此sizeof arr将返回指针类型的大小,而不是它指向的内存块的大小(因此,你需要跟踪它的数量)你单独分配的元素)。

怎么样:

 int* function(int tags){ int * var = malloc(sizeof(int)*tags); //.... return var; } 

基本元素类型的数组和指针在C / C ++中(大多数)是同义的,因此您可以返回指向数组的第一个元素的指针,并将其用作数组本身。

请注意,您的代码具有输入参数a ,但使用tags为数组分配内存。 我在上面的代码中假设您希望将输入参数用于此目的

此外,当您不再使用数组时,您必须在上面function返回的指针上调用free() ,以避免内存泄漏。 malloc上面分配的内存足以容纳inttags数,所以数组相当于int var[tags];

更新:删除了malloc返回的malloc

在C中,数组与指向数组元素的指针基本相同。 所以char []基本上是char *

不要忘记跟踪数组的大小,我也注意到标签似乎是一个全局变量,大多数时候,避免全局变量是一个好主意

这是一些示例代码:

 #include  #include  int* foo(size_t arrSize){ int* arr = (int*) malloc(sizeof(int)*arrSize); return arr; } int main (int argc, char** argv){ printf("Printing array:\n"); int* arr = foo(42); for(int i=0; i <42; i++){ arr[i]=i; } for (int i=0; i < 42; i++){ printf("Element: %d: %d\n", i, arr[i]); } free(arr); return 0; }