Dans return "bonjour", la chaîne "bonjour" est en mémoire statique (comme les variables globales), typiquement dans une zone en lecture seule.
Dans return "bonjour", la chaîne "bonjour" est en mémoire statique (comme les variables globales), typiquement dans une zone en lecture seule.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Bon encore une nouvelle question lool et oui et ouii, c'est toujours au sujet de créer une fonction qui renvoit une chaine mais pour cette fonction je vois pas comment faire:
Donc en fait je veux copier l'intégralité de Conjonction dans le nouveau tableau à deux dimensions new et je veux renvoyer new.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 char *creer(int L, int C, char **conj) { int i, j; char **new; new=malloc(sizeof(*new) * C); for(i=0; i<C; i++) new[i] = malloc(sizeof(**new) * L); for(i=0; i<C; i++) for(j=0; j<L; j++) new[i][j]=conj[i][j]; char** Buffer = malloc(sizeof(*Buffer)*C); for(i=0; i<C; i++) Buffer[i] = malloc(sizeof(**Buffer) * L); for(i=0;i<C;i++) { if(Buffer != NULL) strcpy(Buffer[i],new[i]); } return Buffer; }
Donc j'aimerais savoir comment ça marche dans ce cas précis vu que ce n'est pas un char * mais un char **
Merki
Alors tu retournes un char **. C'est pas évident ?
Attention, je ne sais pas trop ce que tu cherches à faire, mais ça me parit compliqué et surtout tu ne libères pas le premier tableau dynamique (new).
Pourquoi tu fais une copie ? Le premier tableau (new) ne suffit pas ?
En relisant ton code, je pense plutôt qu'il est inutile.
Pour copier les chaines, utlise strdup(), c'est fait pour et c'est POSIX.1, donc très portable... (de plus, c'est facile à reproduire).
Je verrais ça comme ça :
Pose des questions si tu ne comprends pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 #include <stdlib.h> #include <string.h> #include <stdio.h> char **copy_dyn (int L, char const **conj) { char **Buffer = malloc (sizeof *Buffer * L); if (Buffer != NULL) { int i; for (i = 0; i < L; i++) { Buffer[i] = strdup (conj[i]); } } return Buffer; } int main (void) { char const *as[] = { "hello", "world", }; int nb_lin = sizeof as / sizeof *as; char **pp = copy_dyn (nb_lin, as); if (pp != NULL) { int i; for (i = 0; i < nb_lin; i++) { printf ("'%s'\n", pp[i]); } for (i = 0; i < nb_lin; i++) { free (pp[i]), pp[i] = NULL; } free (pp), pp = NULL; } return 0; }
Pas de Wi-Fi à la maison : CPL
Ok merci, je ne connaissais pas les chaînes en lecture seule en mémoire statique.
L'espace mémoire réservé est-il valide pendant toute l'exécution du programme ? Si oui, c'est donc une pratique à éviter dans des structures itératives (mémorisation inutile de plusieurs chaînes qui ne seraient ni copiées dans des variables, ni réutilisées plus tard) ?
<3 Debian
[ C | C++ | PHP | Python ]
Oui, cette mémoire est valide pendant toute la durée du programme.
Et en lecture seule aussi. C'est pourquoi il est recommandé d'utiliser un const char * à la place d'un char *. Si tu compiles avec gcc, l'option -Wwrite-strings t'y aidera.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
"bonjour" est une constante chaîne de caractères, elle est "prête" avant même l'exécution du programme (comme toutes les autres expressions constantes).Envoyé par Haze
Merci à vous deux pour ces précisions.![]()
<3 Debian
[ C | C++ | PHP | Python ]
Une chaine de caractères littérale n'est pas une 'expression constante'. C'est un tableau (non-modifiable L-value) de caractères initialisé. Par contre, il a une adresse qui est une expression constante. C'est cette valeur qui est retournée par la fonction. (En fait, c'est l'adresse du premier élément du tableau, mais c'est la même valeur, c'est garanti par le langage)
Pas de Wi-Fi à la maison : CPL
Alors j'ai fais une fonction pour copier qui ressemble plutôt à ça finalement:
Mais le return ne renvoit rien de bon, alors que quand je fais afficher le tableau new[i][j] pour tout i,j la copie s'est bien déroulé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 char **creer(int L, int C, char **conj) { int i, j; char **new; new=malloc(sizeof(*new) * C); for(i=0; i<C; i++) new[i] = malloc(sizeof(**new) * L); for(i=0; i<C; i++) for(j=0; j<L; j++) new[i][j]=conj[i][j]; return new; }
D'où peut venir ce soucis ?![]()
Pas de Wi-Fi à la maison : CPL
Non en fait je faisais pas un bon printf dans le main pour tester,sinon ma fonction comme la tienne est bonne ...
MerKi !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager