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

时间:2012-01-18 04:00:23

标签: c++ arrays templates copy char

这是我的代码:

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

2 个答案:

答案 0 :(得分:6)

我最好的猜测是,twoone在堆栈中彼此相邻:

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

没有足够的空间来存储HELLO\0 ---&gt;大小为6
因此,您的目标数组two应该至少具有6的大小,否则您的程序将超出数组的边界并导致未定义的行为。

此外,您应该初始化源缓冲区并使用NULL终止它。否则它包含垃圾字符。

char two[6]={0};

根据上述修改,您需要 program works