2012-04-03 21 views
5

返回类型阵列I在C下面的函数:功能在C

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

*var是它的指针到一个数组var

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

+3

关于C良好实践的注意事项:Malloc语句应该是'T * var = malloc(sizeof(* var)* NUM);',对于由调用者而不是被调用者分配的内存来说, 。 – Matt 2012-04-03 14:46:40

回答

12

你真的不能从函数返回一个数组,但有指针​​:

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

复制粘贴错误。谢谢:) – MByD 2012-04-03 15:00:27

-2

在C的阵列基本相同类型的指针数组的一个元素。 所以char []基本上是char *

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

下面是一些示例代码:

#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 *'在函数参数声明的上下文中是相同的,而不是其他地方。 – 2012-04-03 15:56:15

0

如何:

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

数组和指针到基座元件类型是(主要)在C/C++中是同义词,因此您可以返回一个指向数组第一个元素的指针,并使用它作为数组本身。

请注意,您的代码有一个输入参数a,但使用tags为阵列分配内存。在上面的代码中,我假定您想使用输入参数为此目的

另外,当您不再使用数组时,您将不得不调用free()上面function所返回的指针,以避免内存泄漏。上述malloc分配内存足以容纳tagsint S,以使阵列相当于int var[tags];

UPDATE:去除塑像为malloc的回报

+0

谢谢,更新 – Attila 2012-04-03 15:01:58

1

下面这段代码可以澄清一点如何数组和指针的作品。 该函数将为“标记”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; 
} 
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将返回大小的指针类型,而不是它指向的内存块的大小(因此,您将需要跟踪分开分配的元素数量)。