c++ - 当我使用模板将一个字符数组复制到另一个数组时出现问题

标签 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”是常量,因此不应更改。

PS:当我按以下方式启动数组“two”时,它起作用了(但为什么??):

 char two[8];

但是,当我通过以下两种方式启动它时,我得到了奇怪的错误:

 char two[6];

 char two[7];

最佳答案

我最好的猜测是 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 什么都不显示(因为 two 溢出了它的缓冲区,现在 null 终止符是 中的第一个字符一个).

关于c++ - 当我使用模板将一个字符数组复制到另一个数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8904997/

相关文章:

c++ - 使用 Boost.Asio 的简单服务器抛出异常

c - 使用 C 返回数组

c - 将整个数组传递给 C 中的函数

c++ - 标准 C++ 库的替代方案是什么,并通过清晰的实现来提升?

c++ - 调用未知子类的虚方法

objective-c - 数组没有正确保留?

javascript - 在扩展其他模板的模板中加载静态文件 - Django javascript

C++ -- 确定泛型变量是否为指针

python - Flask:蓝图中的模板继承自应用程序中的模板?

c++ - 如何识别共享库,其功能当前正由可执行文件执行