A voir également:
- Petit probleme chaines en C
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Petit 1 comme ² ✓ - Forum Bureautique
- Ecrire les chiffres en petits caractères ✓ - Forum Windows
- Excel trier du plus grand au plus petit - Guide
- Problème réception chaînes 20 21 23 24 25 - Forum Téléviseurs
3 réponses
bizu53
Messages postés
1274
Date d'inscription
samedi 30 août 2008
Statut
Membre
Dernière intervention
21 juin 2015
860
28 mai 2009 à 18:55
28 mai 2009 à 18:55
En effet, msgenv n'est qu'un pointeur, tu as omis de lui allouer de la mémoire. Du coup, quand tu concatènes après, tu concatènes avec de la mémoire non allouée... ça plante :)
char *msgenv = malloc((64*128+1)*sizeof(char)); //64*128+1 parce que vu ce que tu concatènes par la suite, c'est au maximum 64*128 caractères.
Au passage si tu ne te sert pas de ton n autrement dans la while(), autant utiliser une for() c'est plus joli.
char *msgenv = malloc((64*128+1)*sizeof(char)); //64*128+1 parce que vu ce que tu concatènes par la suite, c'est au maximum 64*128 caractères.
Au passage si tu ne te sert pas de ton n autrement dans la while(), autant utiliser une for() c'est plus joli.
for(n = 2 ; n < 64 ; n++) { msg = tab[n]; strcat(msgenv,msg); strcat(msgenv," "); }
Décidément on retombe toujours sur les mêmes problèmes et on comprend pourquoi certains décrient tant le langage C. Le C est un langage qui requiert un minimum de rigueur ! Il ne faut pas l'oublier... et ne pas s'en plaindre car c'est ce qui donne aussi tant de force à ce langage.
Alors utiliser un pointeur implique de respecter l'ordre suivant:
- déclaration / initialisation,
- allocation,
- utilisation,
- libération.
A de rares exceptions près, le non-respect de cet ordre mène tout droit à de graves difficultés.
Qu'avons-nous ici?
Un boucle sur 'n' qui va de 2 à 63, mais il n'y a rien à partir de 4 --->>> on pointe n'importe où. Il faut déclarer:
char tab[64][128]={"premier","deuxieme","troisieme","quatrieme", 0};
et faire un test du style while (tab[++n]) (initialiser n à 1)
strcat(msgenv,msg);
La chaîne pointée par 'msg' va être recopiée à la suite dans 'msgenv', mais comme aucune mémoire n'a été allouée, c'est le 'segment fault' assuré.
Bonne réflexion.
Alors utiliser un pointeur implique de respecter l'ordre suivant:
- déclaration / initialisation,
- allocation,
- utilisation,
- libération.
A de rares exceptions près, le non-respect de cet ordre mène tout droit à de graves difficultés.
Qu'avons-nous ici?
int n = 2; char *msg; char *msgenv; char tab[64][128]={"premier","deuxieme","troisieme","quatrieme"}; while(n < 64) { msg = tab[n]; strcat(msgenv,msg); strcat(msgenv," "); ... }Que d'erreurs !!!
Un boucle sur 'n' qui va de 2 à 63, mais il n'y a rien à partir de 4 --->>> on pointe n'importe où. Il faut déclarer:
char tab[64][128]={"premier","deuxieme","troisieme","quatrieme", 0};
et faire un test du style while (tab[++n]) (initialiser n à 1)
strcat(msgenv,msg);
La chaîne pointée par 'msg' va être recopiée à la suite dans 'msgenv', mais comme aucune mémoire n'a été allouée, c'est le 'segment fault' assuré.
Bonne réflexion.
Alors d'abord merci pour vos reponses j'en apprends plus sur le malloc...
pour le n initialisé a 2 en fait c'est parceque j'utilise le petit bout de code la dans un autre ou il me faut les entrées qui sont apres 2 dans le tableau
Et finalement j'ai reussi a faire plus simple en mettant la chaine grace a sprintf()
puis strcat() avec une boucle while
cest pas propre je pense mais sa marche ...
Pour le for() en fait je voulais juste une boucle donc j'ai pas reflechi...
En tout cas merci car je ne voyais pas a quoi servait malloc concretement...
j'ai du mal avec la notion de pointeur comme vous avez pu voir...
pour le n initialisé a 2 en fait c'est parceque j'utilise le petit bout de code la dans un autre ou il me faut les entrées qui sont apres 2 dans le tableau
Et finalement j'ai reussi a faire plus simple en mettant la chaine grace a sprintf()
puis strcat() avec une boucle while
cest pas propre je pense mais sa marche ...
Pour le for() en fait je voulais juste une boucle donc j'ai pas reflechi...
En tout cas merci car je ne voyais pas a quoi servait malloc concretement...
j'ai du mal avec la notion de pointeur comme vous avez pu voir...