簡體   English   中英

strcpy:數組內存問題

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

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