2013-05-17 14 views
6

Ich versuche, ein Array von Ganzzahlen aus einer Funktion zurückgeben, sortieren Sie die Zahlen und dann alles zurück zu main. Ich habe in diesem Codeabschnitt keinen Speicherplatz zugewiesen und freigegeben. Ich habe nur versucht zu sehen, ob es wirklich funktionieren würde. Der Compiler kennzeichnet einen Fehler für die Anweisung b=sort(a). Es besagt, dass es nicht zuweisbar ist, was sinnvoll wäre. Die Eingabe-Ganzzahlen sind keine Zeiger. Gibt es eine Möglichkeit, ein Array von ganzen Zahlen als Zeiger zu deklarieren? als solche:Return Integer Array von Funktion

int *a[5]={3,4}

#include <stdio.h> 
#include <stdlib.h> 
int *sort(int *input_array); 

int *sort(int *input_array) 
{ 
    return input_array; 
} 

int main() 
{ 
    int a[5]={3,4}; 
    int b[5]; 
    b=sort(a); 
    return 0; 
} 
+1

Mögliche Duplikate von [Rückgabe eines Arrays mit C] (http://stackoverflow.com/questions/11656532/returning-an-array-using-c) –

Antwort

10

Wenn Sie ein Array erstellen, können Sie es nicht dem Array selbst zuweisen (nur den Elementen). Außerdem, wenn Sie ein Array übergeben, übergeben Sie es als Referenz, sort() würde das Array ändern, so dass es nicht erforderlich ist, es zurückzugeben.

Was Sie suchen ist entweder aus: Sortierung der ursprünglichen Anordnung, die so sein würde:

void sort (int * array); 

void sort (int * array) { 
    // do stuff on the array 
} 

int main (void) { 
    int a[5] = {1, 46, 52, -2, 33}; 
    sort(a); // result is still in a 
    return 0; 
} 

oder eine Kopie erstellen und die Sortierung des Gepäcks, das so sein würde:

#include <stdlib.h> 
#include <string.h> 
int * sort (int * array, unsigned size); 

int * sort (int * array, unsigned size) { 
    int * copy = malloc(sizeof(int) * size); 
    memcpy(copy, array, size * sizeof(int)); 
    // sort it somehow 
    return copy; 
} 

int main (void) { 
    int a[5] = {1, 46, 52, -2, 33}; 
    int * b; // pointer because I need to assign to the pointer itself 
    b = sort(a, (sizeof a)/(sizeof *a)); // now result is in b, a is unchanged 
    // do something with b 
    free(b); // you have to 
    return 0; 
} 
5

Sie Arrays nicht zuordnen können, sind sie „Bürger erster Klasse“ nicht, sondern viel wie Zeiger verhalten.

Sie brauchen so etwas wie:

int a[] = { 3, 4 }; 
int *b; 

b = sort(a, sizeof a/sizeof *a); 

Der sizeof Ausdruck benötigt, um die Länge des Arrays zu berechnen, die sort() Funktion, die aus dem bloßen Zeiger nicht bestimmen kann es übergeben wird.

UPDATE: Die oben geht davon aus, dass Sie nicht das Eingangs-Array werden zu ändern, aber wenn man dann tun ist der Rückgabewert nicht, da der Anrufer benötigt natürlich (wie in einem Kommentar, dank wies darauf hin) a wird geändert, wenn der Aufruf sort() zurückgibt.

+1

Das heißt, es ist eine In-Place-Sortierung, also Sie don brauche nicht einmal b. a wird nur nach dem Anruf sortiert. – xaxxon

1

Wenn Sie Array übergeben - ein Zeiger von int, müssen Sie kein geändertes Array zurückgeben. Das Array, das Sie übergeben haben, wird geändert.

Wie @unwind vorgeschlagen, sollten Sie die Anzahl der Elemente auch an die Funktion übergeben, damit die Funktion weiß, wie viele Elemente im Array vorhanden sind.

+0

Also Zeichenarrays dürfen nicht modifiziert werden? oder sie tun .. nur keine Zeichenfolgen variabler Länge? – seasick

+0

@seasick, sorry hat dich nicht bekommen. – Rohan

1

Sie können in C kein Array von Objekten zurückgeben. Sie können nur eine einzelne Instanz eines einzelnen Datentyps zurückgeben.

Dieser Datentyp kann ein Zeiger auf den Speicher sein, der eine sequenzielle Liste von Zahlen (oder irgendetwas anderem) speichert, aber Sie verlieren alle Informationen darüber, wie lang das Ergebnis ist, also müssen Sie das entweder wissen, oder Sie müssen einen anderen haben Wert als eine Ausgabevariable, um Ihnen die Länge zu sagen.

Sie können auch einen benutzerdefinierten Datentyp wie eine Struktur zurückgeben, der sowohl die Datenliste als auch die Länge enthält. Wenn Sie jedoch eine große Datenstruktur zurückgeben, werden mehrere flache Kopien der Datenstruktur erstellt, wodurch die Ausführung Ihres Programms verlangsamt wird und Speicher-Albträume mit Undichtigkeiten und Mehrfachreferenzen erzeugt werden.

Das Zurückgeben eines Zeigers auf eine benutzerdefinierte Datenstruktur kann jedoch sehr gut funktionieren.