Pourquoi le code suivant génère-t-il une erreur de segmentation?

J’essaie d’exécuter une commande UNIX via mon programme qui gérera jusqu’à 4 arguments, pourquoi cela génère-t-il une erreur de segmentation ou d’autres erreurs?

using namespace std; int main() { char buffer[255]; cin >> buffer; char* firstPtr; char* secondPtr; char* thirdPtr; char* fourthPtr; firstPtr = strtok(buffer, " "); secondPtr = strtok(NULL, " "); thirdPtr = strtok(NULL, " "); fourthPtr = strtok(NULL, " "); execlp(firstPtr, secondPtr); return 0; } 

Le crash est dû au fait que votre buffer déborde.

Essayez d’utiliser std::cin.getline(buffer, sizeof(buffer)) au lieu de std::cin >> buffer
Notez également que strtok peut renvoyer NULL , alors assurez-vous de le gérer.

Je pense que vous devriez utiliser

 char buffer[255]; cin.getline(buffer, 255); 

Sinon, vos deuxième, troisième et quasortingème pointeurs seront vides.

Si vous vérifiez la page de execlp de execlp , vous remarquerez que le premier argument (le deuxième paramètre de la méthode, le paramètre arg0 ) est obligatoire, en plus des autres parameters que vous pourriez transmettre à la fonction via des parameters variadic également mentionné dans le texte que

La liste des arguments doit être terminée par un pointeur NULL.

Le premier argument (secondPtr dans votre cas) doit être le nom de l’exécutable; donc vous violez la convention en passant ici NULL (à cause du cin >> autres ont déjà souligné).

Mais en plus, il vous manque au moins un autre argument qui doit être NULL .

Ainsi, une étude des pages de manuel est fortement recommandée!