【发布时间】:2018-04-09 14:36:17
【问题描述】:
下面的代码没有给出任何故障/错误/警告(尽管我认为可能发生了一些非法内存访问)。奇怪的是,使用 2 种不同方法(strlen 和 std::string.size() 打印的字符串的大小不同。
strlen(l_str.c_str()-> 给出的大小为 1500,而, l_str.size()-> 将大小设为 0。
#include <string.h>
#include <string>
#include <stdio.h>
#include<iostream>
using namespace std;
void strRet(void* data)
{
char ar[1500];
memset(ar,0,1500);
for(int i=0;i<1500;i++)
ar[i]='a';
memset(data,0,1500); // This might not be correct but it works fine
memcpy(data,ar,1500);
}
int main()
{
std::string l_str;
cout<<endl<<"size before: "<<l_str.length();
int var=10;
strRet((void *)l_str.c_str());
printf("Str after call: %s\n",l_str.c_str());
cout<<endl<<"size after(using strlen): "<<strlen(l_str.c_str());
cout<<endl<<"Size after(using size function): "<<l_str.size();
printf("var value after call: %d\n",var);
return 0;
}
请建议,如果我正在做一些我不应该做的事情!
另外,我想知道当我执行memset(data,0,1500); 时哪些内存字节被设置为 0?我的意思是,如果假设我的字符串变量的起始地址是 100,那么 memset 命令是否将内存范围 [100,1600] 设置为 0?还是设置其他内存范围?
【问题讨论】:
-
你为什么在 std::string 上使用 memset?使用 std::fill en.cppreference.com/w/cpp/algorithm/fill
-
看起来你在玩未定义的行为很有趣......你不能在 data() 中使用超过字符串大小的内存
-
C++
std::string类不是 C 字符串。一个是具有状态和行为的对象,包括非常常见一个存储长度的数据成员,另一个是char的平面数组,约定应该有一个\0在结束。 -
这和
void *ptr; memset(ptr, 0, 1500);一样没有意义,它会写入一大堆尚未分配的内存。 -
为什么投反对票?所以是错误的代码做坏事,但这不是问问题的重点吗?至少它是一个编译和重现问题的 sn-p。所以有时真的很粗糙。
标签: c++