user-0 提问: 关于memset()函数？

回复:
user: user-1
content: 看了所有的评论之后，弄明白了memset的作用，他是将所有的参数化成二进制之后填入一个字节，比如说，你第一个赋赋的是一百，转成二进制就是0110 0100.   而int有四个字节，也就是说，一个int被赋值之后应该是 0110 0100  /  0110 0100/ 0110 0100/ 0110 0100 转成十进制之后就是1,684,300,900,同理，赋1的结果就是  0000 0001/0000 0001/0000 0001/0000 0001 转成十进制就是16,843,009,同理赋0就全是0,这样说，你应该能够懂得Memset函数的作用了吧

user: user-2
content: memset函数是按照一个字节一个字节的来写的，比如一个int，4个字节，那么memset（void *,100,sizeof（int））就会变成 01100100   01100100   01100100   01100100然后你算一下这对于一个整形来说有多大。。。。。

user: user-3
content: 引用 30 楼 k_badboy 的回复:[quote=引用 29 楼 assassin5616 的回复:] 楼主的例子里面赋值其他不也都成功了么。只能为0的结论是怎么得出的？  因为他的想法是，第一个例子里，每个值应该是100,第二个应该是1[/quote]  呵呵，看来这就是典型的用户描述和实际bug的误差啊。

user: user-3
content: 楼主的例子里面赋值其他不也都成功了么。只能为0的结论是怎么得出的？

user: user-4
content: 说这话的人不动脑子，如果一个参数必须是一个特定的值，那么何必需要这个参数？直接再函数内部实现不就好了？

user: user-5
content: 引用 24 楼 zilaishuichina 的回复:[quote=引用 17 楼 u013946585 的回复:] 你的意思应该是这样的么？  int arr[10]; int a=100; memset (arr,a,sizeof (arr));   如果lz的本意是想把数组元素全部初始化成100，而不是把内存全部初始化成100，memset 做不到 memset 是按照字节并且只按照第2个参数的最后一个字节去初始化内存的（注意：是初始化内存不是数组，单位是字节，不是int） 也就是说哪怕你是memset (arr, 0x12345678, sizeof (int )*10)，最后只是用0x78去初始化这块内存，变成0x78787878... 第一个参数是你要初始化的这块内存的起始地址， 第三个参数是你要初始化的这块内存的大小，单位是字节 第二个参数是这块内存的每个字节里面填什么值，这个参数虽然是一个int，但是只有最低的8位是有效的 [/quote] +++

user: user-6
content: memset是按”字节“把memory从arr开始的sizeof(arr)个单元set(设置为)a.并不关注这个区域的数据是什么类型的。  若a是1，而类型是16位的整型，则按类型得到的是0x0101，其值是1*256+1 （1*2^8+1) 若a是1，而类型是32位的整型，则按类型得到的是0x01010101，其值是（1*2^24+1*2^16+1*2^8+1)  若a是2，而类型是16位的整型，则按类型得到的是0x0202，其值是2*256+2 （2*2^8+2)  若a是2，而类型是32位的整型，则按类型得到的是0x02020202，其值是（2*2^24+2*2^16+2*2^8+2)  关键所在：memset是存储层面的字节操作 而程序中输出格式是数据类型层面的操作 不能把字节单位与数据类型的操作单位混为一谈

user: user-7
content: 引用 24 楼 zilaishuichina 的回复:[quote=引用 17 楼 u013946585 的回复:] 你的意思应该是这样的么？  int arr[10]; int a=100; memset (arr,a,sizeof (arr));   如果lz的本意是想把数组元素全部初始化成100，而不是把内存全部初始化成100，memset 做不到 memset 是按照字节并且只按照第2个参数的最后一个字节去初始化内存的（注意：是初始化内存不是数组，单位是字节，不是int） 也就是说哪怕你是memset (arr, 0x12345678, sizeof (int )*10)，最后只是用0x78去初始化这块内存，变成0x78787878... 第一个参数是你要初始化的这块内存的起始地址， 第三个参数是你要初始化的这块内存的大小，单位是字节 第二个参数是这块内存的每个字节里面填什么值，这个参数虽然是一个int，但是只有最低的8位是有效的 [/quote]

user: user-8
content: 引用 17 楼 u013946585 的回复:你的意思应该是这样的么？  int arr[10]; int a=100; memset (arr,a,sizeof (arr));   如果lz的本意是想把数组元素全部初始化成100，而不是把内存全部初始化成100，memset 做不到 memset 是按照字节并且只按照第2个参数的最后一个字节去初始化内存的（注意：是初始化内存不是数组，单位是字节，不是int） 也就是说哪怕你是memset (arr, 0x12345678, sizeof (int )*10)，最后只是用0x78去初始化这块内存，变成0x78787878... 第一个参数是你要初始化的这块内存的起始地址， 第三个参数是你要初始化的这块内存的大小，单位是字节 第二个参数是这块内存的每个字节里面填什么值，这个参数虽然是一个int，但是只有最低的8位是有效的

user: user-9
content: 引用 29 楼 assassin5616 的回复:楼主的例子里面赋值其他不也都成功了么。只能为0的结论是怎么得出的？  因为他的想法是，第一个例子里，每个值应该是100,第二个应该是1

user: user-10
content: void *memset(void *s, int c, size_t n); The memset() function fills the first n bytes of the memory area pointed to by s with the constant byte c.

user: user-11
content: 仅供参考： #include <stdio.h> float data[500]; int i; void main() {     for (i=0;i<500;i++) {data[i]=1.0f;printf("%g\n",data[i]);}     __asm {         push ecx         push edi         mov ecx,500         mov eax,0xBF800000 //-1.0f         lea edi,data         rep stosd         pop edi         pop ecx     }     for (i=0;i<500;i++) printf("%g\n",data[i]); }

user: user-12

user: user-13
content: 没听说过只能是0. 只是平时使用时一般都是赋0，主要对一块内存进行初始化，尤其是字符串对象。对于数字时，全赋0就表示数字0；对于字符串，0就是终止符，也即空字符串。

user: user-8
content: 那你应该是实验错了~~   	char a[10]; 	memset(a, 'A', sizeof(char) * 10);  memset之后a中全是 'A'

user: user-14
content: 引用 19 楼 u013946585 的回复:[quote=引用 14 楼 u014749886 的回复:] [quote=引用 10 楼 u013946585 的回复:] [quote=引用 7 楼 buyong 的回复:] 贴出实验代码和实验结果是多么重要。 否则lz说我做实验了，就只能是0，别人可以质疑。  试验图，看看吧：  [/quote]   这不是已经被被初始化了吗？[/quote] 你确定这初始化了？除了0意外都没有被成功初始化吧？[/quote]   memset是的一段内存进行初始化，对这段内存每个字节进行初始化，memset(arr,100,sizeof(arr))的时候，就是把每一个字节都初始化成100 也就是0x64，你读取的是%d，也就是四个字节的整形，所以你读取出来的是值是0x64646464，转化成十进制就是1684300900，其他的同理

user: user-15
content: 就让事实来说话吧 #include <stdio.h> #include <stdlib.h> #include <memory.h> int main() {     char *s =(char *)malloc(9);     memset(s,'a',8);     s[8]='\0';     printf("%s\n",s);     return 0; } //aaaaaaaa  Process returned 0 (0x0)   execution time : 0.057 s Press any key to continue. //

user: user-16
content: 楼主，您要的不是memset，而是arrset ---这个是您想要的 void arrset(int * arr, int val, int size) {     for(int cnt = 0; cnt < size; ++cnt)         arr[cnt] = val; } ---这个是memset void memset(void * arr, int val, int size) {     char * arr2 = (char *)arr;     char val2 = (char)val;     for(int cnt = 0; cnt < size; ++cnt)         arr2[cnt] = val2; } !!!

user: user-11
content: 引用 13 楼 u013946585 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 仅供参考： #include <stdio.h> float data[500]; int i; void main() {     for (i=0;i<500;i++) {data[i]=1.0f;printf("%g\n",data[i]);}     __asm {         push ecx         push edi         mov ecx,500         mov eax,0xBF800000 //-1.0f         lea edi,data         rep stosd         pop edi         pop ecx     }     for (i=0;i<500;i++) printf("%g\n",data[i]); }   我新手，实在他太高大上了，参考不了，看不懂。[/quote] 这是使用VS支持的内嵌汇编语法，借助汇编指令填充一组浮点数的例子代码。 http://bbs.csdn.net/topics/390676437

user: user-0
content: 引用 14 楼 u014749886 的回复:[quote=引用 10 楼 u013946585 的回复:] [quote=引用 7 楼 buyong 的回复:] 贴出实验代码和实验结果是多么重要。 否则lz说我做实验了，就只能是0，别人可以质疑。  试验图，看看吧：  [/quote]   这不是已经被被初始化了吗？[/quote] 你确定这初始化了？除了0意外都没有被成功初始化吧？