Pointeur de string en C
nico
-
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
je suis bloqué sur un programme en C
j'ai fait char** ptr;
ptr[0]="float";
if(ptr1[0]=="float") {
...
}
et là j'ai une erreur de segmentation
impossible de résoudre un problème qui parait si facile
je suis bloqué sur un programme en C
j'ai fait char** ptr;
ptr[0]="float";
if(ptr1[0]=="float") {
...
}
et là j'ai une erreur de segmentation
impossible de résoudre un problème qui parait si facile
6 réponses
Salut,
Il faut lui allouer de la place à ton pointeur:
Et utilise strcmp au lieu de ==, parce que le == sur des char * ne fera que comparer l'adresse et non pas le contenu des chaines.
Il faut lui allouer de la place à ton pointeur:
char **ptr; int i; ptr = malloc( sizeof(char *) * NB_POINTEURS_QUE_TU_VEUX); ptr[0] = "prout"; if(strcmp(prt[0], "prout") == 0){ //tout va bien }
Et utilise strcmp au lieu de ==, parce que le == sur des char * ne fera que comparer l'adresse et non pas le contenu des chaines.
normale tu n'as pas alloué de memoire :
ce que tu cherche à faire c'est un tableau de string :
char** ptr;
ptr = (char **)malloc(sizeof(char *)*LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU);
ptr[0]=(char*)malloc(strlen("float")*sizeof(char) + 1);
strcpy(ptr[0],"float");
//et voila le tour est joué
if(strcmp(ptr[0],"float") == 0) { //pour la comparaison de 2 chaines utilise strcmp -> renvoie -1 si plus petit, 0 si idem
//1 si plus grand
...
}
//quand tu fais un malloc il faut faire un free alors tu fais à la fin de ton programme :
for(i=0;i<LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU;i++){
free(ptr[i]);
}
free(ptr);
//attention ne le fais que si toute tes case de ton tableau ont "recu" un malloc sinon "segfault"
et voila j'espere t'avoir aider
tchû
ce que tu cherche à faire c'est un tableau de string :
char** ptr;
ptr = (char **)malloc(sizeof(char *)*LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU);
ptr[0]=(char*)malloc(strlen("float")*sizeof(char) + 1);
strcpy(ptr[0],"float");
//et voila le tour est joué
if(strcmp(ptr[0],"float") == 0) { //pour la comparaison de 2 chaines utilise strcmp -> renvoie -1 si plus petit, 0 si idem
//1 si plus grand
...
}
//quand tu fais un malloc il faut faire un free alors tu fais à la fin de ton programme :
for(i=0;i<LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU;i++){
free(ptr[i]);
}
free(ptr);
//attention ne le fais que si toute tes case de ton tableau ont "recu" un malloc sinon "segfault"
et voila j'espere t'avoir aider
tchû
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
et oui java masque toutes ces allocations et grace à son garbage collector plus de free. ahhhhh JAVA ... enfin c'est un peu lourd comme langage ...
allé bon courage pour la suite
allé bon courage pour la suite
tu crois pas que ton ptr[0]="prout" va planter ? toi non pluis tu n'as pas alloué de memoire ... lol
à moins que ... euh non je ne sais pas en fait là j'ai un trou de memoire, enfin bref il faut tester mais là je dois dire que j'ai un bug...
bon allé bonne journée
tchû
ptr[0] est de type char * et la place du pointeur en lui même est bien allouée. Par contre le pointeur ne pointe sur rien puisque j'ai pas refait de malloc derrière.
Donc pour l'instant c'est l'équivalent d'un
Et je peux le faire pointer sur ce que je veux:
...sachant que prout est une chaine allouée dans une zone de la mémoire en lecture seule à l'initialisation de l'application. Sa place en elle même est déjà allouée et "prout" retourne une adresse vers cette chaîne de caractère (de type const char *).
Voilà donc c'est la même chose pour ptr[0].
Par contre ce que je ne peux pas faire ça:
Car tmp ne pointe sur rien, donc il ne pourra pas recopier "prout", donc crak!
Et donc même chose pour ptr[0].
Pour faire un strcpy effectivement il faudrait faire comme tu as fait: en allouant chaque pointeur de ptr.
ok merci pour ce petit eclairci j'étais dans le flou (je passe mes exams alors la prog j'en bouffe de tout les cotés)
bon allé à la prochaine (d'ici cet été je poste sur le wifi (si tu t'en souviens))
tchû
Pour sûr! D'ailleurs j'ai dans l'idée, si je trouve le temps cet été, d'écrire un tuto sur une page perso sur comment écrire un driver Linux pour le wifi. Si ça t'interesse je te dirai quand ce sera fait...