[英]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.