0

我写了下面这段代码,得到了上面提到的错误

有人能告诉我哪里出错了吗

谢谢。

#include "iostream"
#include "sstream"
#include <string.h>

int main()
{
     std::string temp1 = "454552354772";
    char arr[16];
    memcpy(arr , &temp1 , temp1.size());
    std::string temp2;
    memcpy(&temp2 , arr , temp1.size());
    std::cout<<temp2;

}

我得到的错误是

*** Error in `./a.out': double free or corruption (fasttop): 0x00000000016c5010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x80a46)[0x7fa91d359a46]
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x20)[0x7fa91dc78290]
./a.out[0x400bc9]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7fa91d2faea5]
./a.out[0x400a09]
4

3 回答 3

1

您不能以string这种方式处理类对象。

memcpy(arr , &temp1 , temp1.size());

应该

temp1.copy(arr, temp1.size());

memcpy(&temp2 , arr , temp1.size());

应该

std::string temp2(arr, temp1.size());
于 2013-06-05T06:30:14.137 回答
0

如果你从字符串的位置复制(它还包含函数、其他数据等),并复制 16 个字节,你最终会得到很多不可用的数据。

你想要字符串中的第一个字符,所以你会这样做: memcpy(arr, &temp1[0], temp1.size());

这将有效地复制它。当你想做相反的事情(复制到字符串)时,为什么不这样做呢? std::string temp2(arr, temp1.size());或者std::string temp2((const char*) arr);

于 2013-06-05T06:34:21.897 回答
0

std::string是一个动态分配的容器。您应该很少将其用作memcpy. 在您的代码中,没有为temp2. 解决方法是使用string::reserve预分配内存。

但是,通常不需要将 C 代码 ( memcpy, char[]) 与 C++ 代码 ( std::string, std::cout) 混合使用。显然,你做错了什么。

于 2013-06-05T06:31:15.733 回答