2010-03-10 8 views
4

Je voudrais savoir s'il existe un moyen de retourner un tableau de caractères. J'ai essayé quelque chose comme ça "char [] fun()" mais j'ai une erreur.Renvoyer un tableau dans c

Je ne veux pas de solution de pointeur. Merci!

+7

Une solution de pointeur est précisément la réponse que vous recherchez. Veuillez expliquer pourquoi cela n'est pas approprié. – sleske

+0

http://c-faq.com/~scs/cclass/int/sx5.html –

+6

ne pas avoir peur du fils 'pointer'. Il deviendra votre ami en un rien de temps. :) –

Répondre

11

Vous pouvez retourner un tableau en l'enveloppant dans une struct:

struct S { 
    char a[100]; 
}; 

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

Bon déménagement! Niel – abubacker

+0

Il vous manque un point-virgule (et un 't'). –

+0

@tusbar Merci, corrigé. –

3
tableaux

ne sont pas 1er objets de classe en C, vous devez traiter avec eux par l'intermédiaire des pointeurs, si le tableau est créé dans votre fonction, vous aurez également pour assurer son sur le tas et l'appelant nettoie la mémoire

+0

Je suppose qu'il est nouveau à C, il ne comprendra probablement pas les objets de première classe et tas :) –

+0

possible non, mais alors ils savent quelle réponse à demander/rechercher la prochaine! –

5

Les tableaux ne peuvent pas être transmis ou retournés par valeur dans C.

Vous devrez accepter un pointeur et une taille pour un tampon pour stocker vos résultats, ou vous devrez renvoyer un type différent, tel qu'un pointeur . Le premier est souvent préféré, mais ne correspond pas toujours.

4

fonctions C ne peuvent pas retourner types de tableau. Les types de retour de fonction peuvent être autre chose que "tableau de T" ou "fonction renvoyant T". Notez également que vous ne pouvez pas affecter de types de tableau; c'est-à-dire que le code suivant ne fonctionnera pas:

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

Les tableaux en C sont traités différemment des autres types; Dans la plupart des contextes, le type d'une expression de tableau est implicitement converti ("decays") de "N-element array de T" en "pointer vers T", et sa valeur est définie pour pointer sur le premier élément du tableau. Les exceptions à cette règle sont lorsque l'expression de tableau est un opérande des opérateurs sizeof ou address-of (&) ou lorsque l'expression est un littéral de chaîne utilisé pour initialiser un autre tableau dans une déclaration.

la déclaration constatant

T a[N]; 

pour tout type T, les commandes suivantes sont remplies:

 
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 

En raison de la règle de conversion implicite, lorsque vous passez un argument de tableau à une fonction, ce la fonction reçoit est une valeur de pointeur, pas une valeur de tableau:

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

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

Remarquez aussi t chapeau faisant quelque chose comme

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

ne fonctionne pas; Si la fonction n'existe plus, le tableau arr n'existe plus et son contenu peut être écrasé avant que vous ne puissiez l'utiliser. Si vous n'allouez pas dynamiquement des tampons, le mieux est de passer les tableaux que vous voulez modifier en tant qu'arguments à la fonction, ainsi que leur taille (puisque la fonction ne reçoit qu'une valeur de pointeur, elle ne peut pas dire tableau est):

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

un code très très basique et une explication très très basique Comment retourner tableau arrière d'une fonction définie par l'utilisateur principal function..Hope Il aide !! Ci-dessous, j'ai donné un code complet pour faire comprendre à quelqu'un comment cela fonctionne exactement?:) :)

#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; 
} 
+1

Le programme a un comportement indéfini, vous renvoyez un pointeur vers un objet local qui est immédiatement détruit, toute utilisation de 'arrptr' dans' main' est un comportement indéfini. –

Questions connexes