2012-04-03 15 views
5

I haben folgende Funktion in C:Funktion mit Rückgabetyp Array in C

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

*var ist es ein Zeiger auf ein Array var?

Wenn ja, wie kann ich das Array (var) in der Funktion zurückgeben?

+3

Hinweis auf C gute Praxis: Malloc-Anweisungen sollten sein 'T * var = malloc (sizeof (* var) * NUM); ', es gilt auch als gute Praxis für Speicher vom Anrufer zugewiesen werden, anstatt der Angerufenen . – Matt

Antwort

12

Sie können aus einer Funktion nicht wirklich ein Array zurück, sondern ein Zeiger:

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

Kopieren-Einfügen-Fehler. Danke :) – MByD

-2

In C eine Matrix ist im Grunde die gleiche Art wie ein Zeiger auf ein Element des Arrays. So char [] ist grundsätzlich char *

Vergessen Sie nicht, die Größe des Arrays zu verfolgen, auch ich bemerkte, dass Tags scheint eine globale Variable zu sein, die meiste Zeit ist es eine gute Idee, global zu vermeiden Variablen

Hier einige Beispiel-Code:

#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

"In C ist ein Array im Grunde genommen der gleiche Typ wie ein Zeiger auf ein Element des Arrays" - das ist zu einfach, um falsch zu sein. Ein Array ist nicht dasselbe wie ein Zeiger, und ein Array * Ausdruck * ist nicht dasselbe wie ein Zeiger-Ausdruck. Ein Array-Ausdruck hat immer einen Array-Typ. In den meisten Fällen wird ein Array-Ausdruck jedoch durch einen Zeigerausdruck ersetzt, der auf das erste Element im Array verweist. 'char []' und 'char *' sind nur im Kontext einer Deklaration von Funktionsparametern gleich, nicht anderswo. –

0

Wie wäre:

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

Arrays und Zeiger auf dem Basiselement sind (meistens) auch in C/C++, so kann man einen Zeiger auf das erste Element eines Arrays zurückgeben und so verwenden, als wäre es das Array selbst.

Beachten Sie, dass Ihr Code einen Eingabeparameter a hat, aber tags verwendet, um den Speicher für das Array zuzuweisen. Ich nahm im obigen Code an, dass Sie den Eingangsparameter für diesen Zweck verwenden wollten

Außerdem müssen Sie free() auf den Zeiger, der von function oben zurückgegeben wird, wenn Sie das Array nicht mehr verwenden, um Speicherverluste zu vermeiden . malloc ordnet oben Speicher genug tags Anzahl von int s zu halten, so dass das Array entspricht int var[tags];

UPDATE: entfernt Besetzung für malloc ‚Rückkehr

+0

danke, aktualisiert – Attila

1

Dieser Code unten könnte etwas wie Array und Zeiger Arbeiten klären. Die Funktion reserviert Speicher für "Tags" int-Variablen, dann initialisiert sie jedes Element mit einer Zahl und gibt das Speichersegment zurück, das auf das Array zeigt. Von der Hauptfunktion werden wir das Array-Element zyklisch und drucken, dann werden wir den nicht mehr benötigten Speicher freigeben.

#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

In C können Funktionen Array-Typen nicht zurückgeben. Für Ihre Zwecke, möchten Sie einen Zeiger auf int zurückzukehren:

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

Dies wird ein Block des Speichers groß genug zuteilen tags ganzzahlige Werte und weisen Sie die Adresse des ersten Elements des Blocks zu var zu halten. Beachten Sie, dass var ein Zeiger auf int ist, kein Zeiger auf ein Array von int. Dieser Zeiger wird von der Funktion zurückgegeben.

können Sie den Index verwenden oprerator auf einem Zeiger Ausdruck als ob es eine Reihe waren, etwa so:

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

arr ist ein Zeiger Ausdruck, kein Ausdruck Array, so sizeof arr die Größe zurückkehren des Zeigertyps, nicht die Größe des Speicherblocks, auf den er zeigt (deshalb sollten Sie die Anzahl der Elemente, die Sie separat zugewiesen haben, im Auge behalten).