2 votes

Strsep() avec un pointeur char donne une erreur de segmentation en c

int main() {
  char* instruction = "x10,   14(x2)";
  char* rd = strsep(&instruction, ",");
  printf("%c", *rd);

  return(0);
}

J'essayais d'exécuter ces quelques lignes, et je m'attendais à ce qu'elles impriment "x", mais cela donne une erreur de segmentation. Qu'ai-je fait de mal ?

3voto

kiran Biradar Points 10819

De manuel de strsep

 char *strsep(char **stringp, const char *delim);

 Si *stringp est NULL, la fonction strsep() renvoie NULL et ne fait
   rien d'autre. Sinon, cette fonction trouve le premier jeton dans la
   chaîne *stringp, délimité par l'un des octets de la chaîne
   delim. Ce jeton est terminé en écrasant le délimiteur avec un
   caractère nul ('\0'), et *stringp est mis à jour pour pointer après le jeton.
   Si aucun délimiteur n'a été trouvé, le jeton est considéré comme la totalité
   de la chaîne *stringp, et *stringp est mis à NULL.

Vous essayez de modifier la chaîne en lecture seule en la passant à strsep.

  char* instruction = "x10,   14(x2)";
  char* rd = strsep(&instruction, ",");

essayez

  char* instruction = "x10,   14(x2)";
  char *temp = strdup(instruction);
  char *save = temp;
  char* rd = strsep(&temp, ",");
  free(save);

Vous devez conserver une copie du pointeur vers temp afin de pouvoir le libérer plus tard.

Exemple: D'après la description "stringp est mis à jour pour pointer après le jeton.", si vous utilisez free(temp) vous passerez une adresse invalide à free() car temp ne pointe plus vers le début du bloc alloué, il pointe quelque part à l'intérieur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X