[langage c] Prblème de pointeur

mohamed -  
thefox37 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
voici la fonction suivante codée en langage c, et à la compilation j'obtiens un warning qui dit que j'ai retourné une variable local. Je ne comprends pas pourquoi car le type retourner est bien le même que celui de la fonction c.a.i un pointeur sur un char.


char *f2(void){
char tab[4+1];
strcpy(tab,"abc");
return tab;
}



Marci de votre aide
A voir également:

3 réponses

tafiscobar Messages postés 1277 Date d'inscription   Statut Contributeur Dernière intervention   177
 
salut, oui tab est une variable locale et a la sortie de la fct ce qui lui avait été alloué ds la pile est supprimée. Voici ce qu'il faut faire :

char *f2() {
    char *tab = malloc (5*sizeof(char));
    strcpy (tab, "abc");
    return tab;
}

// lorsq t'auras fini avec ton tableau ds l'appelant tu le libéres ainsi
//supposons lors de l'appel t'as fait ainsi:
char *tab = f2 ();
// aprés utiisation...
free (tab);
0
mohamed
 
Bonjour,
je vous remercie de votre aide cela m'a appris des notions sur les variables locales que je ne connaissais pas.

La solution apporté à mon problème était correct cependant elle en a engendré une autre.

Dans la fonction f2() j'ai bien fait l'allocation de mémoire et le waening a disparu, et un autre est apparu:
warning: assignment makes pointer from integer without cast

Voila comment j'ai résolu le problème, j'ai caster avant le malloc:
char *tab = (char*)malloc(5*sizeof(char));


Ma première question est la suivante pourquoi sur certaine machine il faut caster avant le malloc et pas sur d'autre?

Et la deuxième est que signifie exactement le (char*) devant le malloc?

Je tiens à préciser que je travail sur windows xp avec un logiciel nommé Dev-C++

Cordialment
0
thefox37 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
si tu regardes la doc de malloc, tu verras que cette fonction renvoie un void * (un pointeur de type générique). Le (char *) permet de spécifier que tu cast (force le type) du void * en char *, c-a-d tu lui précises que ta variable pointe vers un type char, et non générique
0