2010-03-04 9 views
0

Je struct avec cette définition:C: strtok sur pointeur dans une struct

typedef struct gRow{ 
    char *txt; 
    char *fileName; 
    int line; 
} gRow; 

et je veux utiliser strtok sur la chaîne txt. donc, dans une fonction qui a gRow *row, je fais ceci:

strtok(row->txt, SEPERATOR_CHARACTERS); 

et c'est le point où je reçois Segmentation Fault. si je le remplace par:

strtok(strdup(row->txt), SEPERATOR_CHARACTERS); 

cela fonctionne très bien. des idées pourquoi?

Merci.

Shahar.

+1

Initialisez 'row-> txt' correctement avant l'appel de' strtok'? –

+0

N'oubliez pas de libérer la mémoire allouée avec strdup après avoir fini avec! – Jackson

+0

Peter, j'ai fait. Jackson, Merci, je sais que je devrais le libérer - mais j'espère trouver une solution qui ne nécessite pas d'utiliser strdup. –

Répondre

1

Vous devez allouer la mémoire pour gRow * row; Ensuite, ça va fonctionner, j'espère.

+0

J'ai alloué ... le code est ici de la fonction qui obtient le pointeur après tout ce qui est déjà alloué. –

3

Notez que strtok modifie la chaîne - si votre pointeur txt pointe sur une chaîne en lecture seule (par exemple un littéral de chaîne const), vous obtiendrez une exception.

1

strtok modifie la chaîne qui lui est attribuée. Si vous n'avez pas le droit de le modifier, vous risquez d'obtenir une erreur de segmentation. strdup empêche cela en copiant la chaîne.

1

strtok modifie son premier argument.

Dans le cas 1, vous semblez passer un pointeur sur la constante char qui n'a pas pu être modifiée.

et dans le cas 2 vous transmettiez une copie modifiable retournée par strdup.

+0

Merci pour votre réponse. dans le cas 1, ce pointeur char n'est pas constant (je ne l'ai pas défini comme un). alors ... qu'est-ce qui le fait arriver? –

+0

@Shaharg: Je voulais dire, avez-vous fait quelque chose comme: row-> txt = "text"; Si oui, vous ne pouvez pas modifier ce que row-> txt pointe vers, donc vous ne pouvez pas passer row-> txt à strtok. – codaddict