Pointeur de string en C
Fermé
nico
-
20 mai 2008 à 10:42
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 - 20 mai 2008 à 11:20
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 - 20 mai 2008 à 11:20
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
A voir également:
- Pointeur de string en C
- Pointeur souris disparu pc portable - Guide
- Pointeur souris - Guide
- Vli product string - Forum Disque dur / SSD
- Pointeur souris disparu pc portable asus - Forum Périphériques
- Souris tactile disparue !!! - Forum Windows 8 / 8.1
6 réponses
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
20 mai 2008 à 10:48
20 mai 2008 à 10:48
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.
daronmaster
Messages postés
326
Date d'inscription
vendredi 12 janvier 2007
Statut
Membre
Dernière intervention
11 mai 2009
44
20 mai 2008 à 10:56
20 mai 2008 à 10:56
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û
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
20 mai 2008 à 10:58
20 mai 2008 à 10:58
NB_POINTEURS_QUE_TU_VEUX
[....]
LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU
Hihi.... ;-)
[....]
LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU
Hihi.... ;-)
daronmaster
Messages postés
326
Date d'inscription
vendredi 12 janvier 2007
Statut
Membre
Dernière intervention
11 mai 2009
44
20 mai 2008 à 11:01
20 mai 2008 à 11:01
oauis je sais, pour moi une string c'est un char *... '-)
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
20 mai 2008 à 11:06
20 mai 2008 à 11:06
Non c'est juste qu'on a eu la même idée de mêttre des noms de constantes macro gigantesque (un rien m'amuse)....
;-)
;-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
daronmaster
Messages postés
326
Date d'inscription
vendredi 12 janvier 2007
Statut
Membre
Dernière intervention
11 mai 2009
44
20 mai 2008 à 11:09
20 mai 2008 à 11:09
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
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
20 mai 2008 à 11:09
20 mai 2008 à 11:09
Salut,
par exemple
106485010510997108
par exemple
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char** ptr; char s[]="float"; ptr=(char **) malloc(2*sizeof (char *)); ptr[0]="float"; ptr[1]=s; if(strcmp(ptr[1],"float")==0) printf("%s\n",ptr[0]); return 0; }--
106485010510997108
20 mai 2008 à 10:58
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û
20 mai 2008 à 11:05
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.
20 mai 2008 à 11:08
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û
20 mai 2008 à 11:15
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...
20 mai 2008 à 11:19