我用过这段代码.这里从4开始的位置存在一个字符串,字符串的长度为14.所有这些计算都在此代码之前完成.我正在粘贴包含代码的错误的小片段.
void *data = malloc(4096);
int len = 14;
int fileptr = 4;
string str;
cout<<len<<endl;
cout<<fileptr<<endl;
memcpy(&str, (char *)data+fileptr, len);
cout<<len<<endl;
cout<<fileptr<<endl;
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
14
4
4012176
2009288233
Run Code Online (Sandbox Code Playgroud)
我在这里从内存中读取一个字符串"System Catalog".它正确显示字符串.但是使用memcpy()函数后,fileptr和len的值突然发生了变化.
string是不一样的char*.string是一个对象.所以你不能只是memcpy()数据.所以这段代码的行为是未定义的.
在您的情况下,您将14字节的垃圾数据复制到str并破坏堆栈.结果是你要覆盖垃圾len和fileptr垃圾malloc().
我不确定你要做什么,但是如果你想创建一个字符串,你应该这样做:
string str = "System Catalog";
Run Code Online (Sandbox Code Playgroud)