含有string的结构体使用memset()函数??

一个含有string类型的结构体typedefstruct{stringname;intage;}TABLE;TABLE*pT1=newTABLE();memset(pT... 一个含有string类型的结构体
typedef struct
{
string name;
int age;
}TABLE;
TABLE *pT1 = new TABLE();
memset(pT1,0,sizeof(TABLE));
//pT1->name ="zhang";
char*p = "zhang";
memcpy((char*)pT1->name.c_str(),p,6);
问题1:在vs2005里面运行正常,在linux下memset(pT1,0,sizeof(TABLE));会运行失败报"段错误",是什么原因。
问题2:string类型可以使用memset 、memcpy函数吗?
展开
 我来答
seizeF
2014-02-10 · TA获得超过412个赞
知道小有建树答主
回答量:207
采纳率:0%
帮助的人:227万
展开全部
string不能使用memset或者memcpy这些低级函数。如果正好工作,那是你比较幸运。c++规定,除了trivially copyable类型可以使用memcpy函数外,其他类型是未定义行为。你new完后string的构造函数已经调用完毕,你再memset就破坏了他的内部数据不变式。

注意,你是在写C++代码,而不是C代码。
追问
对“写的是C++代码,不是C代码”的概念不是很清楚。感觉c++就多了类,多态,派生等概念
string不能使用memset这些函数 是不是可以说对类的对象都不能使用这些函数?
追答
用好这些概念就需要很多经验,一旦你接触到实际项目,那么这些这些用法才会更加清晰。 不是对所有类不能用,而是只能对于简单的类使用,比如POD(Plain old data),即兼容的C的结构体。c++有构造函数,构造函数用于执行初始化,建立不变式。而析构函数用来销毁对象。memcopy的话,对于没有拷贝构造函数的可以使用(具体还有很多限制,可以搜索trivially copyable type)。  简而言之就是,因为memset这种低级函数绕过了封装,可能会触发意想不到的行为。
超人影视娱乐
高粉答主

2015-09-14 · 闲来无事的影评人-关注我把
超人影视娱乐
采纳数:7757 获赞数:60597

向TA提问 私信TA
展开全部
string类是C++中专门处理字符串的类,它的实际上是basic_string<char>的一个typedef。它有四个跌代器:
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef _String_iterator<_Elem, _Traits, _Alloc> iterator;//models random iterator
typedef _String_const_iterator<_Elem, _Traits, _Alloc> const_iterator;////models random iterator//models random iterator
一个静态常量:static const size_typed npos = -1;
basic_string模板定义的类型:
typedef traits traits_type; //某个具体类型的模板参数
typedef typename traits::char_type value_type;
typedef Allocator allocator_type;
typedef typename Allocator::size_type size_type;
typedef typename Allocator::difference_type difference_type;
typedef typename Allocator::reference reference;
typedef typename Allocator::const_reference const_reference;
typedef typename Allocator::pointer pointer;
typedef typename Allocator::const_pointer const_pointer;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式