![](/img/trans.png)
[英]Does strcpy'ing a string into into a larger char array cause a memory leak?
[英]strcpy: array memory questions
我正在嘗試使用“ C++ for Lazy Programmers ”一書來學習 C++,它提供了myStrcpy
函數來復制兩個字符串(第 306 頁),我在這個小例子中使用了它:
#include <iostream>
void myStrcpy(char* destination, const char* source);
int main()
{
char ca1[] = "this";
char ca2[] = " is a test of this.";
myStrcpy(ca1, ca2);
std::cout << ca1 << " \t " << ca2 << '\n';
}
void myStrcpy(char* destination, const char* source)
{
while (*source)
*destination++ = *source++;
*destination = '\0'; //put null character at the end
}
當我嘗試運行該程序時,出現以下錯誤: *運行時檢查失敗 #2 - 變量“ca1”周圍的堆棧已損壞。 切換變量時不會出現錯誤,因此myStrcpy(ca2, ca1)
。
以我對 C++ 和 Google 的一點了解,我認為這是因為myStrcpy
寫入了它沒有業務寫入的區域(因為要復制到的數組比另一個短),對嗎?
如果是這種情況,那么執行此操作的正確程序是什么? 創建一個新的字符數組,然后覆蓋指向舊數組的指針? 我認為人們仍然需要從舊的內存中正確釋放內存,這是正確的還是 C++ 會自動處理?
提前感謝您的時間,真的很感激!
您正在從ca2
復制 - 其中文本" is a test of this."
is - into ca1
- 當前存儲"this"
,因此大小為四個字符加上一個 NUL 終止符。 沒有足夠的空間可以復制。 你應該讓ca
比你想復制進去的任何東西都大,例如
char ca1[128] = "this";
更一般地說,在 C++ 中,最好使用std::string
來管理std::string
內存 - 它避免了很多容易出錯的緩沖區分配/大小/釋放邏輯。 使用字符數組是理解內存操作的有用練習,但對於一般文本處理來說不是很好的練習。 如果你想繼續使用字符數組作為練習,接下來的步驟是學習動態分配字符數組( new char[n]
),釋放它們( delete[] char_array
),並使用strlen(const char*)
找出現有緩沖區中的文本字符數(不包括 NUL 終止符)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.