#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i, a[10]; for (i=0;i<10;i++) a[i]=0xFFFFFFFF; for (i=0;i<10;i++) printf("a[%d]=0x%x\n",i,a[i]); printf("\nAfter memset() function operation:\n"); memset(a, 100,sizeof(int)); for (i=0;i<10;i++) printf("a[%d]=0x%x\n",i,a[i]); system("pause"); }运行这个程序后发现,只有a[0]的值被改为0x64646464,其它数组元素的值还是0xffffffff。因为十进制的100对应于0x64,int类型占4个字节,memset(a, 100,sizeof(int));这条语句将从数组a的地址(也就是第一个元素a[0]的地址 &a[0])开始,依次把4个内存单元中的值都设置为0x64,所以a[0]的值变成了0x64646464。
例2
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i, a[10]; printf("the size of array a[] is %d bytes.\n", sizeof(a)); printf("the size of int is %d bytes.\n", sizeof(int)); for (i=0;i<10;i++) a[i]=0xFFFFFFFF; for (i=0;i<10;i++) printf("a[%d]=0x%x\n",i,a[i]); printf("\nAfter memset() function operation:\n"); memset(a,'0',sizeof(a)); for (i=0;i<10;i++) printf("a[%d]=0x%x\n",i,a[i]); system("pause"); }运行这个程序后发现数组a中的每一个元素(从a[0]到a[9]),其值都被改为0x30303030。注意'0'对应的ASCII码值是48(即0x30)。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i, a[10]; for (i=0;i<10;i++) a[i]=0xFFFFFFFF; for (i=0;i<10;i++) printf("a[%d]=0x%x\n",i,a[i]); printf("\nAfter memset() function operation:\n"); memset(a,1,5); for (i=0;i<10;i++) printf("a[%d]=0x%x\n",i,a[i]); system("pause"); }运行这个程序后发现数组元素a[0]的值被修改为0x1010101,a[1]的值被修改为0xffffff01,a[2]到a[9]的值还是0xffffffff。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i, a[10]; for (i=0;i<10;i++) a[i]=0xFFFFFFFF; for (i=0;i<10;i++) printf("a[%d]=0x%x\n",i,a[i]); printf("\nAfter memset() function operation:\n"); memset(a,0x87654321,5); printf("0x87654321=%d\n",0x87654321); printf("0x87654321 mod 256 = %d = 0x%x\n",(0x87654321 % 256), (0x87654321 % 256)); for (i=0;i<10;i++) printf("a[%d]=0x%x\n",i,a[i]); system("pause"); }
0x87654321作为一个有符号的int类型整数时,对应于十进制的 -2023406815 。但是 memset 在填充时不管正负,只使用0x87654321的低 8 位 0x21。运行这个程序后数组元素a[0]的值被修改为0x21212121,a[1]的值被修改为0xffffff21,a[2]到a[9]的值还是0xffffffff。
前面我们都是把memset函数当成一个“黑盒子”,给它输入不同的值,观察输出结果。现在我们来打开这个“黑盒子”,看看memset函数的一个内部实现作为参考吧(不同情况下具体的实现过程可能有轻微差异,这里只是其中的一个例子):
void * Memset(void* buffer, int c, int count) { char* pvTo=(char*)buffer; assert(buffer != NULL); while(count-->0) *pvTo++=(char)c; return buffer; }这时再回过头看前面的例子,是不是理解得更加透彻了? --------------------------------------
#include <stdio.h> #include <stdlib.h> int main() { unsigned int a; int i; char *p; a=0x12345678; printf("a=0x%x\n",a); p=(char *)&a; for (i=0;i<4;i++) printf("p+%d=0x%x, *(p+%d)=0x%x\n", i, (p+i), i, *(p+i)); system("pause"); }int 类型的变量在VC中长度为4个字节,从程序运行后的显示结果可以看出,int 类型变量 a 的值放在四个内存单元中,地址从低到高的单元中依次存放0x78、0x56、0x34、0x12,这四个字节的值拼成变量a的值。