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.