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
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

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
Salut,

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.
0
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:58
salut kilian,

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û
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526 > daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009
20 mai 2008 à 11:05
Nan, plantera pô ;-)

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
char *tmp;

Et je peux le faire pointer sur ce que je veux:
tmp = "prout"

...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:
char *tmp;
strcpy(tmp, "prout");

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.
0
daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44 > 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:08
ah si prout ne fait pas crack alors blop ...
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û
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526 > daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009
20 mai 2008 à 11:15
bon allé à la prochaine (d'ici cet été je poste sur le wifi (si tu t'en souviens))

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...
0
daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44 > 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:19
ouais il faut voir,c'est sur que cela m'interesse mais il faut serieusement que je me plonge la dedans de plus près car là je n'ai fait que survolé et en plus sur windows xp, bon sur linux je préfère (je sais pas je me sens mieux quoi), je ne sais pas si tu peux m'envoyer des mail à partir du forum mais sinon c'est mon pseudo suivi de @ et du domaine fraçais de hotmail. voila (bouh pour la methode pour donner mon mail mais bon tu as compris)
0
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
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û
0
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
NB_POINTEURS_QUE_TU_VEUX
[....]
LE_NOMBRE_DE_STRING_QUE_TU_VEUX_DANS_TON_TABLEAU


Hihi.... ;-)
0
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
oauis je sais, pour moi une string c'est un char *... '-)
0
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
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)....
;-)
0
merci
j'avais oublié les mallocs comme toujours depuis que je suis sur le java
0

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
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
0
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
Salut,

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
0