如何清空结构体数组?

xuntaohm 2010-07-09 12:00:49
struct st_r
{
''''''''
''''''''
}
str_r st[20];
要清空这个结构体数组,用memset函数,我换了几种做法似乎都不行。
memset(&st,NULL,sizeof(st)*40);
memset(&st,NULL,sizeof(st)*40);
memset(st,NULL,sizeof(st));
memset(st,NULL,sizeof(st));

for (int i=0 ; i<20 ; i++)
{
memset(&st[i],0x00,sizeof(struct st_r));
}
把NULL换成0也不行。请教大虾指教做法。
...全文
5606 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
ecton 2010-07-15
  • 打赏
  • 举报
回复
哎,结构体和类在C++中除了权限和分配存储方式不同外,别的都是一样的。你这样用也没什么。不要想一下子清空了,具体用的时候再初始化。
str_r st[20];
st[i].pDevSocket=null;
st[i].port=0;
st[i].connect_state=0;
st[i].devname="";
bcj00000 2010-07-15
  • 打赏
  • 举报
回复
struct DevQueue
{
CString devname;
RequestSocket* pDevSocket;
CString addr;
int port;
BOOL connect_state;
};

RequestSocket* pDevSocket ;这个是个指针吧。你要清空了也不能用了
Kevin_Perkins 2010-07-15
  • 打赏
  • 举报
回复
结构体,在C++中就是类,为什么不写一个具有清空功能的成员函数呢?应该有一个。
xuntaohm 2010-07-15
  • 打赏
  • 举报
回复
谢谢各位热心的回答,看来我这样用结构体确实不太好清空。帖子分太少,实在对不起各位大侠。
康斯坦汀 2010-07-10
  • 打赏
  • 举报
回复
27楼说的对,再总结一下:

1. 结构体中不要放置类。
2. sizeof对于包含指针的结构获得的长度不是你想要的。

其他人说的都是针对无指针和类的情况下,其实全都是错误的,即便结果对,也是错误的作法!
starcat 2010-07-10
  • 打赏
  • 举报
回复
2楼的是标准方法
whut_lcy 2010-07-10
  • 打赏
  • 举报
回复
结构体成员如果仅仅是基本类型成员你可以直接memset(ST,0,sizeof(ST))
但你的结构体里面包含有指针,直接这样memset是不行的,因为指针成员的sizeof都是4字节。你应该专门对指针成员进行memset
na2650945 2010-07-10
  • 打赏
  • 举报
回复
MARK.
学习啦。
经验的积累。
phpjspasp 2010-07-09
  • 打赏
  • 举报
回复
memset(st,NULL,sizeof(st));
memset(st,'\0',sizeof(st));

应该可以
康斯坦汀 2010-07-09
  • 打赏
  • 举报
回复
应该是sizeof没有获得正确的长度,结构体包含指针?
应该把结构体内的成员正确长度相加。
xuntaohm 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sujiewen 的回复:]

for (int i=0 ; i<20 ; i++)
{
memset(&st[i],0,sizeof(struct st_r));
}
这样不行吗
[/Quote]
不行啊,试过了。清空是没错,但是清空之后结构体的对象赋值就出问题了。
pengzhixi 2010-07-09
  • 打赏
  • 举报
回复
memset(st,0,sizeof(st)*20);
sujiewen 2010-07-09
  • 打赏
  • 举报
回复
for (int i=0 ; i<20 ; i++)
{
memset(&st[i],0,sizeof(struct st_r));
}
这样不行吗
jeremyhuang81 2010-07-09
  • 打赏
  • 举报
回复
结构体还是设置的简单些吧。尽量不要把类放置在里面,否则会出现意想不到的错误
liutengfeigo 2010-07-09
  • 打赏
  • 举报
回复
maoloverme1 2010-07-09
  • 打赏
  • 举报
回复
有CString,所以建议不要用memset
kaxnet 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 r3000 的回复:]

CString是一个类,我觉得类放到结构里就是很奇怪的作法。换成TCHAR、LPCTSTR之类的。
[/Quote]

同楼上, 解决方案可以是将CString类型换掉, 或者将struct变成类, 由它自行处理初始化, 或者使用新的函数去解决问题, 而不是用memset.

类型换掉带来兼容问题可以尝试一下Adapter.
magic7004 2010-07-09
  • 打赏
  • 举报
回复
晕,把CString整个用memset清空,不出错就奇怪了
daitounaoshi 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gz_qmc 的回复:]

楼主说的四种情况
memset(&st,NULL,sizeof(st)*40);
memset(&st,NULL,sizeof(st)*40);
memset(st,NULL,sizeof(st));
memset(st,NULL,sizeof(st));

恰恰没有正确的这种
memset(st,0,sizeof(str_r)*20);
[/Quote]
这个是正确的
康斯坦汀 2010-07-09
  • 打赏
  • 举报
回复
CString是一个类,我觉得类放到结构里就是很奇怪的作法。换成TCHAR、LPCTSTR之类的。
加载更多回复(13)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧