这是我的代码:
#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”是const,因此不应更改。
PS:当我以下列方式启动数组“两个”时,它可以工作(但是为什么?):
char two[8];
然而,当我以下列两种方式启动它时,我会遇到奇怪的错误:
char two[6];
或
char two[7];
答案 0 :(得分:6)
我最好的猜测是,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
没有显示任何内容(因为两个超过其缓冲区,现在空终止符是one
中的第一个字符)。
答案 1 :(得分:4)
为了能够将源缓冲区复制到目标,您需要足够大的目标缓冲区来保存源缓冲区。
char two[5];
没有足够的空间来存储H
,E
,L
,L
,O
,\0
---&gt;大小为6
因此,您的目标数组two
应该至少具有6
的大小,否则您的程序将超出数组的边界并导致未定义的行为。
此外,您应该初始化源缓冲区并使用NULL终止它。否则它包含垃圾字符。
char two[6]={0};
根据上述修改,您需要 program works 。