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 终止符)。
我正在尝试使用“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 终止符)。