memset 函数

归途醉染 2018-03-07 09:25:17
memset(void *s,int ch,size_t n);


平常用这个函数 将值清空

现在 将ch 不置为0 设置为7


void main()
{
char name[]="2018/3/7 星期三";

memset(name,0,4);
//memset(name,7,4);
printf("name is %s\n",name);

system("pause");
}

ch 为0 时 运行结果 如下:

ch 为7时 运行结果如下:


看百度百科解释为:函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
那这样 我ch 为7时 内存中都是7吧。。。。。

都搞不明白了
帮我解说一下吧 谢谢!~~
...全文
622 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
mstlq 2018-03-08
  • 打赏
  • 举报
回复
参考一楼的回复,楼主想要打出来全是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");
}
L-talent 2018-03-08
  • 打赏
  • 举报
回复
这个我回复过你,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]
赵4老师 2018-03-08
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 我还提供观察用的工具。 理解讨论之前请先学会如何观察
归途醉染 2018-03-08
  • 打赏
  • 举报
回复
引用 25 楼 zhao4zhong1 的回复:
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵老师 你总说站到最高点去讲
赵4老师 2018-03-08
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
  • 打赏
  • 举报
回复
运行不出来是因为???
  • 打赏
  • 举报
回复
#include<stdio.h> void main() { char name[]="2018/3/7 星期三"; //memset(name,7,4); printf("name is %s\n",name); printf("pause"); } 这个才能运行啊,这个是不是不完整????
归途醉染 2018-03-08
  • 打赏
  • 举报
回复
引用 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] 明白了 谢谢版主
L-talent 2018-03-08
  • 打赏
  • 举报
回复
我大概明白你的意思了。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]
paschen 2018-03-08
  • 打赏
  • 举报
回复
通常对于字符串,很少有填充7的实际用处,memset并不是只能用于填充字符串,他可以填充任意用处的一块内存,关键是看你需要什么就用什么的语句
归途醉染 2018-03-08
  • 打赏
  • 举报
回复
引用 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 会发生什么了?
归途醉染 2018-03-08
  • 打赏
  • 举报
回复
引用 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 我已知 ,谢谢!
归途醉染 2018-03-08
  • 打赏
  • 举报
回复
引用 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的时候内存中的数据不会丢失? 这样做的好处是?
paschen 2018-03-08
  • 打赏
  • 举报
回复
引用 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
mstlq 2018-03-08
  • 打赏
  • 举报
回复
回楼主,这个就是类似下面的区别

int main()
{
       int i =-1;
       i = 0;  // 类比memset(name, 0, 4);
       printf("%d",i);
       i = 7; //类比memset(name, 7, 4);
       printf("%d",i);
}
楼主别想太复杂
归途醉染 2018-03-08
  • 打赏
  • 举报
回复
引用 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]明白
paschen 2018-03-08
  • 打赏
  • 举报
回复
引用 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相当于直接是个空字符串
归途醉染 2018-03-08
  • 打赏
  • 举报
回复
引用 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的区别 所以去打印 发现不同,又没搞明白 所以来请教大家
自信男孩 2018-03-08
  • 打赏
  • 举报
回复
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]
归途醉染 2018-03-08
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
[quote=引用 3 楼 ambition_阿彬的回复:][quote=引用 1 楼 paschen 的回复:] 内存中的7是不可打印字符,所以是看不到的,而字符'7'对应的ascii码并不是7,而是55
那把第二个参数ch设置为7的作用是?[/quote] 作用就是把这块内存每个字节用7填充而已,只不过7是不可打印字符,你输出这个字符串看到的并不是'7'[/quote] 那这块内存用0填充 和用7填充有什么区别?。。。。。。。
加载更多回复(12)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧