如何清空结构体数组?

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));
把NULL换成0也不行。请教大虾指教做法。
回复yf882 :
for (int i=0 ; i<20 ; i++)
{
memset(&st[i],0x00,sizeof(struct st_r));
}
这种做法也不行。

你要清空,我一般都不用什么函数,我会是用一个标识符flag。。。。

struct st_r
{
''''''''
''''''''
int flag;
}
str_r st[20];

这个用法比较简单,当数组的该元素表示存在的时候,flag=1,该元素不存在的时候,flag=0。。。。

如果你对这个用法有什么问题,可以密我,困啊,要去睡觉了。。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-05-31
对于数组删除,一般就是使用后面数组元素前移的操作,来覆盖前一元素,达到删除的效果。。。。

例如数组a[10],要删除a[5]这个元素,那么只需要把后面的元素前移一位就行了,也就是a[5]=a[6],a[6]=a[7],a[7]=a[8],这样子a[5]这个元素的内容就会被全部抹杀掉了。。。。

不过这里存在一个问题,你一个结构体数组前移的时候,如何判断有多少个元素要前移呢。。。。

所以我的做法是在结构体里面定义一个标示符int flag。。。。

当对这个结构体数组元素赋值时,如a[10].name="KING" 时,那么就是说下标值为10的元素是存在的,赋完值后,来个a[10].flag=1 来标记一下。。。。

这样做的话,我们可以进行这样的删除操作了,如删除下标值为5的元素——
int i=5;
for(int j=i+1;a[j].flag==1;i++,j++)
{
a[i]=a[j];
/* 结构体数组可以直接这样子做,它会自动把a[i]里面的变量等于a[j]里面对应的变量 */
}
a[i].flag=0;
/* 如果你里面原来有10个元素,那么删除了其中一个,那就剩下9个,a[9]那个位置应该为空,一一把里面的元素清空太麻烦,直接把它的标示符flag等于0,就表示该位置为空的 */
第2个回答  2010-07-15
memset(&st[i],0x00,sizeof(struct st_r));

bzero(&st[i],sizeof(struct st_r));
然后循环

测试函数:
#include <stdio.h>
#include <string.h>

#define bzero(a, b) memset(a, 0, b)

struct st_r
{
int a;
};

int main()
{
struct st_r st[20];

memset(&st[0],0x00,sizeof(struct st_r));
printf("a:%d\n",st[0].a);
memset(&st[0],0x01,sizeof(struct st_r));
printf("a:%d\n",st[0].a);
bzero(&st[0],sizeof(struct st_r));
printf("a:%d\n",st[0].a);
getchar();
return 0;
}
输出:
a:0
a:16843009
a:0
由于int 是4字节 memset是按字节赋值,即a=0x01010101=16843009
另:bzero在linux里的string.h,win下用的话需要自己定义(测试函数中有)
你提到的NULL定义是define NULL 0 效果是一样的,但NULL一般用于指针
第3个回答  2020-04-28
你想清空?那就是全部置0哦,比如
stru_data是一个结构体,可以这样:
memset(&stru_data,
0,
sizeof(stru_data));

ps:stru_data是一个对象,如果是指针指向的话,上面就不用&,后面就是sizeof(/*里面是结构体的名字*/)
相似回答