这是我的代码:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
template <class T1, class T2>
void copy2(const T1 source[], T2 destination[] , int size){
for (int i=0 ; i < size ; ++i){
destination[i]=static_cast<T1>(source[i]);
}
}
int main() {
const char one[] = "hello";
char two[5];
cout << "one: " << one << endl;
cout << "two: " << two << endl;
copy2(one, two, 6);
cout << "one: " << one << endl;
cout << "two: " << two << endl;
return 0;
}
但它输出:
一个:你好
二:
一个:
二:你好
此外,数组“one”是常量,因此不应更改。
PS:当我按以下方式启动数组“two”时,它起作用了(但为什么??):
char two[8];
但是,当我通过以下两种方式启动它时,我得到了奇怪的错误:
char two[6];
或
char two[7];
最佳答案
我最好的猜测是 two
和 one
在堆栈上彼此相邻,如下所示:
t w o - - o n e - - -
--------------------------------------------
| | | | | | h | e | l | l | o | \0 |
--------------------------------------------
由于当 two
的大小为 5 时,您通过将大小 6 传递给 copy2
溢出了 two
的缓冲区,因此内存最终会像这个:
t w o - - o n e - - -
--------------------------------------------
| h | e | l | l | o | \0 | e | l | l | o | \0 |
--------------------------------------------
这就是为什么 two
显示为“hello”而 one
什么都不显示(因为 two 溢出了它的缓冲区,现在 null 终止符是 中的第一个字符一个
).
关于c++ - 当我使用模板将一个字符数组复制到另一个数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8904997/