当我使用模板将一个char数组复制到另一个时出现问题

Issue when I copy a char array to another, using a template

本文关键字:复制 数组 char 另一个 问题 一个      更新时间:2023-10-16

这是我的代码:

#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];

我的最佳猜测是twoone在堆栈上彼此相邻,如下所示:

  t   w   o   -   -   o   n   e   -   -    -
 --------------------------------------------
|   |   |   |   |   | h | e | l | l | o |  |
 --------------------------------------------

two的大小为5时,通过将大小6传递给copy2,使two的缓冲区溢出,因此内存将以如下方式结束:

  t   w   o   -   -   o    n   e   -   -   -
 --------------------------------------------
| h | e | l | l | o |  | e | l | l | o |  |
 --------------------------------------------

这就是为什么two似乎保持"hello",而one什么也不显示(因为两个覆盖了它的缓冲区,现在空终止符是one中的第一个字符)。

为了能够将源缓冲区复制到目标,您需要足够大的目标缓冲区来容纳源缓冲区。

char two[5];

没有足够的空间存储HELLO-->大小为6
因此,您的目标数组two的大小至少应为6,否则您的程序将写入超出数组的范围,并导致"未定义的行为"。

另外,你应该初始化你的源缓冲区并用NULL终止它。否则它会包含垃圾字符。

char two[6]={0};

通过上述修改,您的程序可以按我的要求运行