user-0 提问: memset 函数

回复:
user: user-1
content: 参考一楼的回复，楼主想要打出来全是7，那就应该： void main() {     char name[]="2018/3/7 星期三";           // memset(name,0,4);     memset(name,'7',4);//注意7两边的单引号     printf("name  is %s\n",name);       system("pause"); }

user: user-2
content: 这个我回复过你，int型就只能设置0或-1。我刚才试了一下7，是乱码，好像就不支持 引用 23 楼 qq_36088602 的回复:[quote=引用 22 楼 qq_35876885 的回复:] 我大概明白你的意思了。ch代表的是你要替换的值。因为你是char型数组，ch是int型，所以ch就是对应ASCII值的值。就相当于你这么定义： char a=0;char b=7;  这时候a其实是Null,b其实Bel. [quote=引用 11 楼 qq_36088602 的回复:] [quote=引用 6 楼 qq_35876885 的回复:] memset函数按字节对内存块进行初始化，所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。 我也是刚百科回来的，大概应该是，就不能设置为7，，，  谢谢兄弟 有心了。。。。。。。。。。  但是  memset 我看到别人有用7  故纳闷   我一般都是用它清空内存[/quote][/quote]   对 我也是根据“自信男孩”的 然后我在ASCII才看明白   那依你意思：  我要是设置int类型的数组 那么此时的7 会发生什么了？ [/quote]

user: user-3
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 我还提供观察用的工具。  理解和讨论之前请先学会如何观察！

user: user-0
content: 引用 25 楼 zhao4zhong1 的回复:电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  赵老师 你总说站到最高点去讲

user: user-3
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-4
content: 运行不出来是因为？？？

user: user-4
content: #include<stdio.h> void main() {     char name[]="2018/3/7 星期三";                  //memset(name,7,4);      printf("name  is %s\n",name);       printf("pause"); } 这个才能运行啊，这个是不是不完整？？？？

user: user-0
content: 引用 20 楼 paschen 的回复:[quote=引用 18 楼 ambition_阿彬的回复:][quote=引用 16 楼 paschen 的回复:] [quote=引用 12 楼 ambition_阿彬的回复:][quote=引用 7 楼 paschen 的回复:] [quote=引用 3 楼 ambition_阿彬的回复:][quote=引用 1 楼 paschen 的回复:] 内存中的7是不可打印字符，所以是看不到的，而字符'7'对应的ascii码并不是7，而是55   那把第二个参数ch设置为7的作用是？[/quote] 作用就是把这块内存每个字节用7填充而已，只不过7是不可打印字符，你输出这个字符串看到的并不是'7'[/quote]   那这块内存用0填充 和用7填充有什么区别？。。。。。。。[/quote] 填充的内容不同啦，你看不到并不代表它是0，虽然你结果看似是相同的，但内存上的值是不同的，如果用7填充，他的每个字节是7，用0填充他每个字节是0  此外，字符串是要求以\0结尾的，7并不是字符串的结尾标志  所以你上面的结果，当填充7时还多输出了："/3/7 星期三" , 因为你的字符串并没有结束，只是输出的你看不到而已，而填充0相当于直接是个空字符串[/quote]  也就是说 我输入7的时候内存中的数据不会丢失？ 这样做的好处是？ [/quote] 不存在什么好处，关键是看你程序需要哪种行为，也不存在数据丢失，只不过字符串是以0 结尾，7不是结尾，输出字符串时，遇到0就停止不在输出了，即使这个0后面还有其他有效字符，但遇到7，会继续向后输出（即使是无效字符），直到遇到最后的0[/quote]   明白了 谢谢版主

user: user-2
content: 我大概明白你的意思了。ch代表的是你要替换的值。因为你是char型数组，ch是int型，所以ch就是对应ASCII值的值。就相当于你这么定义： char a=0;char b=7;  这时候a其实是Null,b其实Bel. 引用 11 楼 qq_36088602 的回复:[quote=引用 6 楼 qq_35876885 的回复:] memset函数按字节对内存块进行初始化，所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。 我也是刚百科回来的，大概应该是，就不能设置为7，，，  谢谢兄弟 有心了。。。。。。。。。。  但是  memset 我看到别人有用7  故纳闷   我一般都是用它清空内存[/quote]

user: user-5
content: 通常对于字符串，很少有填充7的实际用处，memset并不是只能用于填充字符串，他可以填充任意用处的一块内存，关键是看你需要什么就用什么的语句

user: user-0
content: 引用 22 楼 qq_35876885 的回复:我大概明白你的意思了。ch代表的是你要替换的值。因为你是char型数组，ch是int型，所以ch就是对应ASCII值的值。就相当于你这么定义： char a=0;char b=7;  这时候a其实是Null,b其实Bel. [quote=引用 11 楼 qq_36088602 的回复:] [quote=引用 6 楼 qq_35876885 的回复:] memset函数按字节对内存块进行初始化，所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。 我也是刚百科回来的，大概应该是，就不能设置为7，，，  谢谢兄弟 有心了。。。。。。。。。。  但是  memset 我看到别人有用7  故纳闷   我一般都是用它清空内存[/quote][/quote]   对 我也是根据“自信男孩”的 然后我在ASCII才看明白   那依你意思：  我要是设置int类型的数组 那么此时的7 会发生什么了？

user: user-0
content: 引用 15 楼 mstlq 的回复:回楼主，这个就是类似下面的区别  int main() {        int i =-1;        i = 0;  // 类比memset(name, 0, 4);        printf("%d",i);        i = 7; //类比memset(name, 7, 4);        printf("%d",i); }  楼主别想太复杂  666  我已知 ，谢谢！

user: user-0
content: 引用 16 楼 paschen 的回复:[quote=引用 12 楼 ambition_阿彬的回复:][quote=引用 7 楼 paschen 的回复:] [quote=引用 3 楼 ambition_阿彬的回复:][quote=引用 1 楼 paschen 的回复:] 内存中的7是不可打印字符，所以是看不到的，而字符'7'对应的ascii码并不是7，而是55   那把第二个参数ch设置为7的作用是？[/quote] 作用就是把这块内存每个字节用7填充而已，只不过7是不可打印字符，你输出这个字符串看到的并不是'7'[/quote]   那这块内存用0填充 和用7填充有什么区别？。。。。。。。[/quote] 填充的内容不同啦，你看不到并不代表它是0，虽然你结果看似是相同的，但内存上的值是不同的，如果用7填充，他的每个字节是7，用0填充他每个字节是0  此外，字符串是要求以\0结尾的，7并不是字符串的结尾标志  所以你上面的结果，当填充7时还多输出了："/3/7 星期三" , 因为你的字符串并没有结束，只是输出的你看不到而已，而填充0相当于直接是个空字符串[/quote]  也就是说 我输入7的时候内存中的数据不会丢失？ 这样做的好处是？

user: user-5
content: 引用 18 楼 ambition_阿彬的回复:[quote=引用 16 楼 paschen 的回复:] [quote=引用 12 楼 ambition_阿彬的回复:][quote=引用 7 楼 paschen 的回复:] [quote=引用 3 楼 ambition_阿彬的回复:][quote=引用 1 楼 paschen 的回复:] 内存中的7是不可打印字符，所以是看不到的，而字符'7'对应的ascii码并不是7，而是55   那把第二个参数ch设置为7的作用是？[/quote] 作用就是把这块内存每个字节用7填充而已，只不过7是不可打印字符，你输出这个字符串看到的并不是'7'[/quote]   那这块内存用0填充 和用7填充有什么区别？。。。。。。。[/quote] 填充的内容不同啦，你看不到并不代表它是0，虽然你结果看似是相同的，但内存上的值是不同的，如果用7填充，他的每个字节是7，用0填充他每个字节是0  此外，字符串是要求以\0结尾的，7并不是字符串的结尾标志  所以你上面的结果，当填充7时还多输出了："/3/7 星期三" , 因为你的字符串并没有结束，只是输出的你看不到而已，而填充0相当于直接是个空字符串[/quote]  也就是说 我输入7的时候内存中的数据不会丢失？ 这样做的好处是？ [/quote] 不存在什么好处，关键是看你程序需要哪种行为，也不存在数据丢失，只不过字符串是以0 结尾，7不是结尾，输出字符串时，遇到0就停止不在输出了，即使这个0后面还有其他有效字符，但遇到7，会继续向后输出（即使是无效字符），直到遇到最后的0

user: user-1
content: 回楼主，这个就是类似下面的区别  int main() {        int i =-1;        i = 0;  // 类比memset(name, 0, 4);        printf("%d",i);        i = 7; //类比memset(name, 7, 4);        printf("%d",i); }  楼主别想太复杂

user: user-0
content: 引用 14楼自信男孩 的回复:0和7，即memset第二个参数是0和7时的问题。memset的功能是将对应的字节数上每个字节用第二个值去覆盖。是0时已经理解了，那么是7时，可以看一下ASCII的十进制是7的符号是那个，如下：  Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char        ────────────────────────────────────────────────────────────────────────        000   0     00    NUL '\0' (null character)   100   64    40    @        001   1     01    SOH (start of heading)      101   65    41    A        002   2     02    STX (start of text)         102   66    42    B        003   3     03    ETX (end of text)           103   67    43    C        004   4     04    EOT (end of transmission)   104   68    44    D        005   5     05    ENQ (enquiry)               105   69    45    E        006   6     06    ACK (acknowledge)           106   70    46    F        007   7     07    BEL '\a' (bell)             107   71    47    G   [quote=引用 13 楼 qq_36088602 的回复:] [quote=引用 10 楼 cfjtaishan 的回复:] [quote=引用 9 楼 cfjtaishan 的回复:] 7和'7'不是一个值，后面的'7'是0x30 + 7, 即48 + 7 = 56; 第一个memset(name, 0, 4);由于将name的前4个字节用0替换了，所以什么也不输出。因为%s遇到'\0'停止输出，name在memset之后第一个字节就是0（0与'\0'相等），因此什么也不输出。 应该是48 + 7即55[/quote]   额。。 说明白了memset(name, 0, 4);这个问题  但是 我想问的是 ch 是7 的时候  同上： 我想问的是在内存中我用0填充和用7填充有什么区别 而不是什么打印啥的 可能是我一开给的图片让大家以为我是要打印吧 我只能想说 ： 不明白0和7的区别 所以去打印 发现不同，又没搞明白 所以来请教大家 [/quote][/quote]明白

user: user-5
content: 引用 12 楼 ambition_阿彬的回复:[quote=引用 7 楼 paschen 的回复:] [quote=引用 3 楼 ambition_阿彬的回复:][quote=引用 1 楼 paschen 的回复:] 内存中的7是不可打印字符，所以是看不到的，而字符'7'对应的ascii码并不是7，而是55   那把第二个参数ch设置为7的作用是？[/quote] 作用就是把这块内存每个字节用7填充而已，只不过7是不可打印字符，你输出这个字符串看到的并不是'7'[/quote]   那这块内存用0填充 和用7填充有什么区别？。。。。。。。[/quote] 填充的内容不同啦，你看不到并不代表它是0，虽然你结果看似是相同的，但内存上的值是不同的，如果用7填充，他的每个字节是7，用0填充他每个字节是0  此外，字符串是要求以\0结尾的，7并不是字符串的结尾标志  所以你上面的结果，当填充7时还多输出了："/3/7 星期三" , 因为你的字符串并没有结束，只是输出的你看不到而已，而填充0相当于直接是个空字符串

user: user-0
content: 引用 10 楼 cfjtaishan 的回复:[quote=引用 9 楼 cfjtaishan 的回复:] 7和'7'不是一个值，后面的'7'是0x30 + 7, 即48 + 7 = 56; 第一个memset(name, 0, 4);由于将name的前4个字节用0替换了，所以什么也不输出。因为%s遇到'\0'停止输出，name在memset之后第一个字节就是0（0与'\0'相等），因此什么也不输出。 应该是48 + 7即55[/quote]   额。。 说明白了memset(name, 0, 4);这个问题  但是 我想问的是 ch 是7 的时候  同上： 我想问的是在内存中我用0填充和用7填充有什么区别 而不是什么打印啥的 可能是我一开给的图片让大家以为我是要打印吧 我只能想说 ： 不明白0和7的区别 所以去打印 发现不同，又没搞明白 所以来请教大家

user: user-6
content: 0和7，即memset第二个参数是0和7时的问题。memset的功能是将对应的字节数上每个字节用第二个值去覆盖。是0时已经理解了，那么是7时，可以看一下ASCII的十进制是7的符号是那个，如下：  Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char        ────────────────────────────────────────────────────────────────────────        000   0     00    NUL '\0' (null character)   100   64    40    @        001   1     01    SOH (start of heading)      101   65    41    A        002   2     02    STX (start of text)         102   66    42    B        003   3     03    ETX (end of text)           103   67    43    C        004   4     04    EOT (end of transmission)   104   68    44    D        005   5     05    ENQ (enquiry)               105   69    45    E        006   6     06    ACK (acknowledge)           106   70    46    F        007   7     07    BEL '\a' (bell)             107   71    47    G  引用 13 楼 qq_36088602 的回复:[quote=引用 10 楼 cfjtaishan 的回复:] [quote=引用 9 楼 cfjtaishan 的回复:] 7和'7'不是一个值，后面的'7'是0x30 + 7, 即48 + 7 = 56; 第一个memset(name, 0, 4);由于将name的前4个字节用0替换了，所以什么也不输出。因为%s遇到'\0'停止输出，name在memset之后第一个字节就是0（0与'\0'相等），因此什么也不输出。 应该是48 + 7即55[/quote]   额。。 说明白了memset(name, 0, 4);这个问题  但是 我想问的是 ch 是7 的时候  同上： 我想问的是在内存中我用0填充和用7填充有什么区别 而不是什么打印啥的 可能是我一开给的图片让大家以为我是要打印吧 我只能想说 ： 不明白0和7的区别 所以去打印 发现不同，又没搞明白 所以来请教大家 [/quote]

user: user-0
content: 引用 7 楼 paschen 的回复:[quote=引用 3 楼 ambition_阿彬的回复:][quote=引用 1 楼 paschen 的回复:] 内存中的7是不可打印字符，所以是看不到的，而字符'7'对应的ascii码并不是7，而是55   那把第二个参数ch设置为7的作用是？[/quote] 作用就是把这块内存每个字节用7填充而已，只不过7是不可打印字符，你输出这个字符串看到的并不是'7'[/quote]   那这块内存用0填充 和用7填充有什么区别？。。。。。。。