[英]Can cout change the contents of a char array?
為了使此操作盡可能簡潔明了,這是我的代碼:
char* aiMove = getAIMove();
cout << aiMove;
cout << "\n" << numMoves << ": " << aiMove << "\n\n";
return aiMove;
這是我的輸出:
a0 a1
0: �����������������������7
因此,第一行調用getAIMove()並將返回值(char *)分配給aiMove。
第二行顯示aiMove(a0 a1)。
第三行將numMoves和aiMove放入cout並進行打印,但它正在打印一些奇怪的值。
第4行返回aiMove,我檢查過它是打印出的奇怪值。
為什么aiMove的價值發生了變化? 似乎僅當我將整數值傳遞給cout時才會發生(在本例中為numMoves)。
請幫忙! 謝謝,帕特里克:)
編輯:我忘了提到的另一件事是,這種奇怪的行為僅在第一次執行此代碼塊時發生,每當它在程序運行期間每次運行時,它都可以正常打印。
這明確表明getAIMove
返回了指向系統可以隨意重用的內存的指針。 來自堆棧或堆的后續分配覆蓋了返回的指針。
發生這種情況的方式有很多,這可能是最常見的:
char *GetAIMove()
{
char buf[128];
strcpy(buf, "a0");
strcat(buf, " ");
strcat(buf, "a1");
return buf; // oops, buf won't exist after we return
}
哎呀。 此代碼返回一個指向緩沖區的指針,該緩沖區在返回時將不復存在。 解決此問題的典型方法是return strdup(buf);
。 只需記住,函數的調用者在完成處理后就需要釋放該字符串。
這是另一種方式:
std::string GetAIMove()
{
// ...
return foo;
}
char* aiMov e= GetAIMove();
// aiMove points to the contents of the returned string, no longer in scope.
對此的解決方法是std::string aiMove = GetAIMove
。 現在, aiMove
將字符串保留在范圍內。
但是最好的解決方法是使用專門設計用於始終保持字符串的字符串類:
std::string GetAIMove()
{
std::string foo;
foo = "a1";
foo += " ";
foo += "a2";
return foo;
}
std::string aiMove = GetAIMove();
請注意,盡管此代碼似乎涉及大量復制,但實際上,現代編譯器將使其高效。 因此,讓您的代碼保持簡單,邏輯性,易於理解和維護,不會感到不好。
不, cout
不會更改參數的內容。
您可能事先在做錯事,並且遇到未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.