C语言中带有返回类型为数组的函数

11

我在C语言中有如下函数:

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

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

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


4
C语言最佳实践提示:使用T *var = malloc(sizeof(*var) * NUM);来分配内存空间,同时建议在调用函数中由调用者而非被调用者分配内存空间。 - Matt
5个回答

20

你不能真正从函数返回一个数组,但可以返回指针:

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

复制粘贴错误。谢谢 :) - MByD

2
下面的代码可以更清楚地说明数组和指针的工作原理。 该函数将为“tags”int变量分配内存,然后初始化每个元素并返回指向数组的内存段。 从主函数中,我们将循环并打印数组元素,然后释放不再需要的内存。
#include <stdio.h>
#include <stdlib.h>

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;
}

1

怎么样:

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

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

请注意,您的代码具有输入参数a,但使用tags来分配数组的内存。我假设您希望在上述代码中使用输入参数来实现这一目的。

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

更新:删除malloc返回值的强制转换


1

在 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数组的指针。该指针是从函数返回的。

您可以在指针表达式上使用下标运算符,就像它是一个数组一样:

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

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


-2
在C语言中,数组基本上与指向数组元素的指针相同。因此char[]基本上就是char*。
不要忘记跟踪数组的大小,我还注意到tags似乎是一个全局变量,大多数情况下避免使用全局变量是个好主意。
这里有一些示例代码:
#include <stdio.h>
#include <stdlib.h>

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;
}

2
在C语言中,数组基本上是指向数组元素的指针相同的类型。这种表述过于简单化,甚至是错误的。数组不是指针,而且数组表达式也不同于指针表达式。数组表达式始终具有数组类型;然而,在大多数情况下,数组表达式将被替换为指向数组第一个元素的指针表达式。char[]char *仅在函数参数声明的上下文中才相同,在其他任何地方都不相同。 - John Bode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接