在结构之间复制字符数据



我的代码中遇到了数据中止异常。很可能我对字符进行了非常糟糕的操作。这段代码似乎有效,但我想知道它是否真的无效。问题是,如果您将一个结构的数据复制到另一个涉及 char 数组的结构,会发生什么。如何复制数据?

我有两个函数,一个会故意泄漏,因为我还想知道如果用new创建的结构有目的地存在,但它复制其数据的结构超出了范围会发生什么。

// Example program
#include <iostream>
#include <string>
#include "string.h"
typedef struct {
char name[12];
char stupid[12];
int hello;
} tFile;
void CopyFileAndDelete(tFile *file1){
tFile *file2 = new tFile;
*file2 = *file1;
std::cout << file2->name << std::endl;
delete file2;
}
void CopyFileAndLeak(tFile *file1){
tFile *file2 = new tFile;
*file2 = *file1;
std::cout << file2->name << std::endl;
}
int main()
{
tFile file1;
memset(&file1, 0, sizeof file1);
file1.hello = 22;
snprintf(file1.name, 12, "%s", "hellogoodfriendhwoareyou");
snprintf(file1.stupid, 12, "%s", "greate");
CopyFileAndDelete(&file1);
CopyFileAndLeak(&file1);
}

除了这段代码通常不安全并且比C++更C之外,它是正确的(除了泄漏。这不可能产生异常(除非由于内存分配失败而引发new异常。

结构内的数组将按预期复制。编译器通常会执行一个memcpy()来复制它们(或类似特殊memcpy的内置功能来优化复制操作。

不过,这不是您应该编写的代码。请改用std::string。不要使用newdelete,请改用值类型。如果确实需要分配,请使用unique_ptrshared_ptr来执行此操作。

不要用C++编写这样的代码:-(

最新更新