2012-04-03 51 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將返回大小的指針類型,而不是它指向的內存塊的大小(因此,您將需要跟蹤分開分配的元素數量)。