这几天使用memset,总结了一些经验,希望有用;
下面代码段里最后一个例子有误,不必去看
//讨论在如下情况中有没有必要初始化a;有人认为如果不初始化会出现乱码,其实不是的,在strcpy时连同'\0'一起复制了,a[3]是0;
//因此没有添加的必要//
#include
#include
#include
int main(void)
{
char a[10];
//memset(a,0,10);
strcpy(a,"abc");
puts(a);//不论是否赋初值,这里输出的始终是abc
}
//这个问题之前在博客中讨论过,可以感受指针降级的情况
int some_func(struct something *a)
{
…
…
memset(a,0,sizeof(a));
…
}//这段程序应该是要给a赋值,但是sizeof(s)仅代表指针的大小,32位机上是4,意思
//仅对a的前四个字节赋值了
//如何对一个整形数组赋初值呢?前面已经提过,memset是按字节进行赋值的;因此下面的做法是错误的
#include
#include
#include
int main(void) { char a[5]; int i=0; memset(a,1,20); while(i<5) { printf("%d\n",a[i]);//理论上应该不能输出5个1的,但好像能输出,只不过程序一运行之后就提示停止工作 //我也不知道为什么 i++; } }
如何给一一个int型的数组赋初值呢?可不可以直接用memset呢?请看下面一组代码:
#include
#include
#include
int main(void)
{
int a[5];
int i=0;
memset(a,1,20);
while(i<5)
{
printf("%d\n",a[i]);//这里输出的不是五个1;而是五个16843009,原因是memset是按字节进行赋值的
i++;
}
}
//可能你会说,memset不能为整形数组赋值;其实也不是绝对的,我们若对整个整形数组赋初值为零的话完全是可以的(每个字节都是零,这个int型
//的数据肯定是零啊)
#include
#include
#include
int main(void) { int a[5]; int i=0; memset(a,0,sizeof(a)); while(i<5) { printf("%d\n",a[i]); i++; } }