4 Stimmen

Rückgabe eines Arrays in c

Ich würde gerne wissen, ob es eine Möglichkeit gibt, ein char-Array zurückzugeben. Ich versuchte etwas wie dieses "char[] fun()", aber ich erhalte Fehler.

Ich will keine Zeigerlösung. Danke!

11voto

Sie können ein Array zurückgeben, indem Sie es in ein struct einwickeln:

struct S {
   char a[100];
};

struct S f() {
    struct S s;
    strcpy( s.a, "foobar" );
    return s;
}

5voto

Arrays können in C nicht als Wert übergeben oder zurückgegeben werden.

Sie müssen entweder einen Zeiger und eine Größe für einen Puffer akzeptieren, um Ihre Ergebnisse zu speichern, oder Sie müssen einen anderen Typ zurückgeben, z. B. einen Zeiger. Ersteres wird oft bevorzugt, ist aber nicht immer passend.

4voto

John Bode Punkte 112486

C-Funktionen können keine Array-Typen zurückgeben. Funktionsrückgabetypen können alles andere sein als "Array von T" oder "Funktion, die T zurückgibt". Beachten Sie auch, dass Sie keine Array-Typen zuweisen können, d.h. Code wie der folgende wird nicht funktionieren:

int a[10];
a = foo();

Arrays werden in C anders behandelt als andere Typen; in den meisten Kontexten wird der Typ eines Array-Ausdrucks implizit von "N-Element-Array von T" in "Zeiger auf T" umgewandelt ("zerfällt"), und sein Wert wird so gesetzt, dass er auf das erste Element im Array zeigt. Die Ausnahmen von dieser Regel sind, wenn der Array-Ausdruck ein Operand von entweder der sizeof oder Adresse-von ( & ), oder wenn der Ausdruck ein String-Literal ist, das zur Initialisierung eines anderen Arrays in einer Deklaration verwendet wird.

Angesichts der Erklärung

T a[N];

für einen beliebigen Typ T, dann ist Folgendes wahr:

Expression     Type      Decays to      Notes
----------     ----      ---------      -----
         a     T \[N\]     T \*            Value is address of first element
        &a     T (\*)\[N\]  n/a            Value is address of array (which
                                          is the same as the address of the
                                          first element, but the types are
                                          different)
  sizeof a     size\_t    n/a            Number of bytes (chars) in array = 
                                          N \* sizeof(T)
sizeof a\[i\]    size\_t    n/a            Number of bytes in single element = 
                                          sizeof(T)
       a\[i\]    T         n/a            Value of i'th element
      &a\[i\]    T \*       n/a            Address of i'th element

Wenn Sie ein Array-Argument an eine Funktion übergeben, erhält die Funktion aufgrund der impliziten Konvertierungsregel einen Zeigerwert und keinen Array-Wert:

int a[10];
...
foo(a);
...

void foo(int *a)
{
  // do something with a
}

Beachten Sie auch, dass etwas wie

int *foo(void)
{
  int arr[N];
  ...
  return arr;
}

funktioniert nicht; sobald die Funktion beendet ist, wird das Array arr technisch nicht mehr existiert und ihr Inhalt möglicherweise überschrieben wird, bevor Sie die Möglichkeit haben, sie zu benutzen.

Wenn Sie keine Puffer dynamisch zuweisen, ist es am besten, wenn Sie die zu ändernden Arrays als Argumente an die Funktion übergeben, zusammen mit ihrer Größe (da die Funktion nur einen Zeigerwert erhält, kann sie nicht sagen, wie groß das Array ist):

int a[10];
init(a, sizeof a / sizeof a[0]);  // divide the total number of bytes in 
...                               // in the array by the number of bytes
void init(int *a, size_t len)     // a single element to get the number
{                                 // of elements
  size_t i;
  for (i = 0; i < len; i++)
    a[i] = i;
}

3voto

jk. Punkte 13339

Arrays sind in C keine Objekte 1. Klasse, man muss mit ihnen über Zeiger umgehen. Wenn das Array in Ihrer Funktion erstellt wird, müssen Sie auch sicherstellen, dass es sich auf dem Heap befindet und der Aufrufer den Speicher bereinigt.

-1voto

Ruchir Punkte 978

A Array von einer benutzerdefinierten Funktion an die Hauptfunktion zurückgibt. hilft!! Unten habe ich den kompletten Code angegeben, damit jeder versteht wie genau es funktioniert? :) :)

#include<iostream>
using namespace std;

char * function_Random()
{
    int i;
    char arr[2];
    char j=65;//an ascII value 65=A and 66=B
    cout<<"We are Inside FunctionRandom"<<endl;
    for(i=0;i<2;i++)
    {
        arr[i]=j++;// first arr[0]=65=A and then 66=B
        cout<<"\t"<<arr[i];
    }
    cout<<endl<<endl;
    return arr;
}
int main()
{

    char *arrptr;
    arrptr=function_Random();
    cout<<"We are Inside Main"<<endl;
    for(int j=0;j<2;j++)
    {
        cout<<"\t"<<arrptr[j];
    }
    return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X