Почему аргумент main () argv типа char * [], а не const char * []? - PullRequest
22 голосов
/ 27 апреля 2011

Когда я написал следующий код и выполнил его, компилятор сказал:

не рекомендуется преобразовывать строковую константу в char*

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

Это означает, что ядолжен был написать const char *.

Но когда мы передаем аргументы в main, используя char* argv[], мы не пишем const char* argv[].

Почему?

Ответы [ 5 ]

9 голосов
/ 27 апреля 2011

Исторические причины.Изменение сигнатуры main () может привести к поломке существующего кода.И возможно, что некоторые реализации позволят вам изменить параметры на main из вашего кода.Однако код, подобный следующему:

char * p = "helllo";
* p = 'x';

всегда недопустим, потому что вам не разрешено возиться с такими строковыми литералами, поэтому указатель должен быть на const char.

7 голосов
/ 27 апреля 2011

Потому что ... argv[] не является постоянным.И это, безусловно, не является (статическим) строковым литералом, поскольку он создается во время выполнения.

Вы объявляете указатель char *, а затем назначаете ему строковый литерал, который по определению является константой;фактические данные находятся в постоянной памяти.

int main(int argc, char **argv)  {
    // Yes, I know I'm not checking anything - just a demo
    argv[1][0] = 'f';
    std::cout << argv[1] << std::endl;
}

Ввод:

g ++ -o test test.cc

. / test hoo

Вывод:

foo

Это не комментарий к почему вы хотите изменить argv,но это, конечно, возможно.

2 голосов
/ 27 апреля 2011

почему требуется, чтобы char * был постоянным при присвоении его строке

Поскольку такие литеральные строки (например, "hi", "hello what's going on" и т. Д.) Хранятсяв только для чтения сегменте вашего exe.Таким образом, указатели, указывающие на них, должны указывать на постоянных символов (например, не могут их изменить).

1 голос
/ 27 апреля 2011

Если вы посмотрите на исполняемые функции, например execve, вы увидите, что они на самом деле не принимают const char* в качестве параметров, но действительно требуют char*, поэтому вы не можете использовать строковую константу для вызова main.

1 голос
/ 27 апреля 2011

Вы присваиваете строковую константу (const char*) указателю на непостоянную строку (char *p).Это позволит вам изменить строковую константу, например, выполнив p[0] = 'n'.

. В любом случае, почему бы вам не использовать std::string вместо этого?(кажется, вы используете C ++).

...