Dans return "bonjour", la chaîne "bonjour" est en mémoire statique (comme les variables globales), typiquement dans une zone en lecture seule.
Version imprimable
Dans return "bonjour", la chaîne "bonjour" est en mémoire statique (comme les variables globales), typiquement dans une zone en lecture seule.
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:
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:
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; }
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) ?
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.
"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).Citation:
Envoyé par Haze
Merci à vous deux pour ces précisions. :)
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)
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:
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 ?:oops:
Non en fait je faisais pas un bon printf dans le main pour tester,sinon ma fonction comme la tienne est bonne ...
MerKi !