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 = '[=10=]'; //put null character at the end
}

当我尝试 运行 程序时,出现以下错误: *运行-Time Check Failure #2 - 变量 'ca1' 周围的堆栈已损坏。当我切换变量时没有出现错误,所以 myStrcpy(ca2, ca1).

由于我对 C++ 和 Google 知之甚少,我认为这是因为 myStrcpy 写入了它没有业务写入的区域(因为被复制到的数组比另一个),是吗?

如果是这样的话,实施它的正确程序是什么?创建一个新的字符数组,然后覆盖指向旧字符数组的指针?我假设仍然需要从旧内存中正确释放内存,这是正确的还是 C++ 会自动处理?

提前感谢您的宝贵时间,非常感谢!

您正在从 ca2 - 文本 " is a test of this." 所在的位置 - 复制到 ca1 - 当前存储 "this" 并且因此大小为四个字符加一个 NUL 终止符。没有足够的空间来复制。您应该使 ca 比您想复制到其中的任何内容都大,例如

char ca1[128] = "this";

更一般地说,在 C++ 中,最好使用 std::string 来管理字符串的内存 - 它避免了很多容易出错的缓冲区 allocation/size/deallocation 逻辑。使用字符数组是理解内存操作的有用练习,但不是一般文本处理的好习惯。如果您想继续使用字符数组作为练习,接下来的步骤是学习动态分配字符数组 (new char[n])、释放它们 (delete[] char_array),并使用 strlen(const char*) 找出现有缓冲区中的文本字符数(不包括 NUL 终止符)。