我写了下面这段代码并得到了上面提到的错误
有人可以告诉我哪里出错了吗
感谢。
#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]
答案 0 :(得分:1)
您不能以这种方式使用string
类的对象。
memcpy(arr , &temp1 , temp1.size());
应该是
temp1.copy(arr, temp1.size());
和
memcpy(&temp2 , arr , temp1.size());
应该是
std::string temp2(arr, temp1.size());
答案 1 :(得分:0)
std::string
是动态分配的容器。您应该很少将其用作memcpy
的目的地。在您的代码中,没有为temp2
分配内存。解决方法是使用string::reserve
来预分配内存。
但是,通常不需要将C代码(memcpy
,char[]
)与C ++代码(std::string
,std::cout
)混合使用。显然,你做错了什么。
答案 2 :(得分:0)
如果你从字符串的位置复制(它还包含函数,其他数据等),并复制16个字节,你最终会得到很多不可用的数据。
你想要字符串中的第一个字符,所以你会这样做:
memcpy(arr, &temp1[0], temp1.size());
这将有效地复制它。
如果你想做相反的事情(复制到字符串),为什么不这样做呢?
std::string temp2(arr, temp1.size());
或std::string temp2((const char*) arr);