Pourquoi est main() argument argv de type char*[] plutôt que de const char*[]?

Quand j'ai écrit le code suivant et exécuté, le compilateur dit

obsolète conversion de chaîne de caractères constante de char*

int main()  
{  
  char *p;  
  p=new char[5];  
  p="how are you";  
  cout<< p;  
  return 0;  
}  

Cela signifie que je l'aurais écrit const char *.

Mais quand on passe des arguments dans main à l'aide de char* argv[] nous ne pas écrire const char* argv[].

Pourquoi?

  • Ok, mais pourquoi est-elle nécessaire pour char* être constante tout en l'affectant à une chaîne de caractères?
  • Votre question est intéressante, mais le code jusqu'à il n'est pas pertinent. Si vous êtes autorisé à céder les littéraux de chaîne pour non-coût des pointeurs n'a rien à voir avec le type de paramètre de main. (Aussi, votre code de fuites de mémoire.)
  • Quelque chose d'autre que vous avez négligé: Nous n'avons pas de passer des arguments dans main. Il est illégal d'appeler main de l'intérieur de votre programme. L'appel de main est quelque chose que votre compilateur met en place pour vous; vous n'êtes pas autorisé à le faire vous-même.
  • Aussi, je crois que vous êtes juste de gaspiller de la mémoire avec la new appel. La chaîne rassemble c'est le propre de la mémoire de la pile.
  • Vous faire passer des paramètres à la main. Juste pas directement. Mais ce sont les mêmes paramètres que vous passez à execve et des fonctions similaires.
  • Hey merci les gars, ya nous passer des paramètres à la main à partir de la borne de droite?
  • Mais vous n'êtes pas le passage d'un const char*, vous êtes en passant une série de caractères. Même si la plate-forme transmet les paramètres pour le programme dans la mémoire en lecture seule, beaucoup d'étapes avant d'arriver à votre programme entre main, dont un qui peut facilement être "copier les paramètres quelque part je peux écrire pour eux."
  • Il y a une fuite de mémoire dans votre exemple