簡體   English   中英

為什么 main() 參數 argv 的類型是 char*[] 而不是 const char*[]?

[英]Why is main() argument argv of type char*[] rather than const char*[]?

當我編寫以下代碼並執行它時,編譯器說

不推薦將字符串常量轉換為char*

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

這意味着我應該寫const char *

但是當我們使用char* argv[]將 arguments 傳遞給main時,我們const char* argv[]

為什么?

歷史原因。 更改 main() 的簽名會破壞太多現有代碼。 並且有可能某些實現允許您從代碼中將參數更改為 main。 然而這樣的代碼:

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

總是非法的,因為你不允許像那樣弄亂字符串文字,所以指針應該指向一個 const char。

因為... argv[]不是 const。 而且它肯定不是(靜態)字符串文字,因為它是在運行時創建的。

您正在聲明一個char *指針,然后為其分配一個字符串文字,根據定義,它是常量; 實際數據在只讀 memory 中。

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 呼

Output:

這不是對您為什么要更改argv的評論,但這當然是可能的。

為什么在將 char* 分配給字符串時需要保持不變

因為這樣的文字字符串(如"hi""hello what's going on"等)存儲在 exe 的只讀段中。 因此,指向它們的指針需要指向常量字符(例如,不能改變它們)。

您正在將字符串常量 ( const char* ) 分配給指向非常量字符串 ( char *p ) 的指針。 這將允許您修改字符串常量,例如通過執行p[0] = 'n'

無論如何,你為什么不使用std::string呢? (您似乎正在使用 C++)。

如果您查看像execve這樣的執行函數,您會發現它們實際上不接受const char*作為參數,但確實需要char* ,因此您不能使用字符串常量來調用main

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM