鱼C论坛

 找回密码
 立即注册
查看: 13181|回复: 14

[函数快查] memset -- 使用一个常量字节填充内存空间

[复制链接]
发表于 2016-12-15 23:12:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
memset 函数文档


函数概要:

memset 函数使用常量字节 c 填充 s 指向的前 n 个字节。

小甲鱼注:memset 函数按照字符数组的方式操作内存对象,其主要目的是提供一个高效的函数接口,通常用于初始化 malloc 函数申请的内存对象。


函数原型:

  1. #include <string.h>
  2. ...
  3. void *memset(void *s, int c, size_t n);
复制代码


参数解析:

参数 含义
s指向要操作的内存空间
c指定要填充的值
n指定要填充 s 指向空间的前 n 个字节


返回值:

返回 s 指向的内存空间。


演示:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define NUM 100

  5. int main(void)
  6. {
  7.         int *ptr;

  8.         ptr = (int *)malloc(NUM * sizeof(int));
  9.         if (ptr == NULL)
  10.         {
  11.                 exit(1);
  12.         }

  13.         memset(ptr, 0, NUM);

  14.         return 0;
  15. }
复制代码


评分

参与人数 2荣誉 +6 鱼币 +6 贡献 +4 收起 理由
assic + 1 + 1 + 1
wanting-for + 5 + 5 + 3 memset(ptr, 0, NUM * sizeof(int));

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-15 23:33:12 | 显示全部楼层
占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-26 10:42:43 | 显示全部楼层
mark
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-27 13:49:31 | 显示全部楼层
第17行应该是:memset(ptr, 0, NUM*sizeof(int));
因为第3个参数n是:指定要填充的指向s空间的钱n个字节,单位是字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 9 反对 0

使用道具 举报

发表于 2017-7-17 22:46:52 | 显示全部楼层
learn more
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-21 20:23:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-19 17:27:53 | 显示全部楼层
第17行应该是memset(ptr,0,NUM * sizeof(int))吧!如果是memset(ptr,0,num)只有前25个字节的数据清零了,我的int型占4字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-14 09:38:10 | 显示全部楼层
#
  1. include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. #define NUM 10

  5. int main(void)
  6. {
  7.     int i;

  8.     int *ptr = NULL;
  9.     ptr = (int *)malloc(NUM*sizeof(int));
  10.    
  11.     if(ptr == NULL)
  12.     {
  13.         exit(1);   
  14.     }   
  15.    
  16.     memset(ptr,1,NUM);

  17.     printf("memset之后的存储空间的值是:");
  18.     for(i = 0; i < NUM ; i++)
  19.     {
  20.         printf("%d ",ptr[i]);   
  21.         
  22.     }
  23.     printf("\n");

  24.     free(ptr);

  25.     return 0;
  26.    
  27. }
复制代码

运行结果:
memset之后的存储空间的值是:16843009 16843009 257 0 0 0 0 0 0 0


为什么这样?只是想填充1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-5-14 09:59:58 | 显示全部楼层
本帖最后由 散步去看雨 于 2019-5-14 10:01 编辑

下面是修改的程序,需要强调的是
参数n的描述

n        指定要填充 s 指向空间的前 n 个字节
初始化是以字节为单位而不是以元素为单位。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. #define NUM 10

  5. int main(void)
  6. {
  7.     int i;

  8.     int *ptr = NULL;
  9.     ptr = (int *)malloc(NUM*sizeof(int));
  10.    
  11.     if(ptr == NULL)
  12.     {
  13.         exit(1);   
  14.     }   
  15.    
  16.     memset(ptr,1,NUM*sizeof(int));

  17.     printf("memset之后的存储空间的值是:");
  18.     for(i = 0; i < NUM ; i++)
  19.     {
  20.         printf("0x%08x ",ptr[i]);   
  21.         
  22.     }
  23.     printf("\n");

  24.     free(ptr);

  25.     return 0;
  26.    
  27. }
复制代码


运行结果:
memset之后的存储空间的值是:0x01010101 0x01010101 0x01010101 0x01010101 0x01010101 0x01010101 0x01010101 0x01010101 0x01010101 0x01010101
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2020-2-23 15:18:03 | 显示全部楼层
求解!!!!!!!!!!!!!!!
代码如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
        int *p,i;
        p=(int *)malloc(4*sizeof(int ));
        memset(p,1,4*sizeof(int ));
        for(i=0;i<4;i++)
        {
                printf("%d  ",p[i]);
        }
        free(p);
        return 0;
}

memset(p,1,4*sizeof(int))中我把‘ 0’ 改为‘ 1 ’ ,为什么打印出来的不是1;
求解!!!!!!!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-7 16:39:30 | 显示全部楼层
18186881740 发表于 2020-2-23 15:18
求解!!!!!!!!!!!!!!!
代码如下
#include

朋友,具体解释看下面这个网站
https://www.cnblogs.com/youxin/p/3226817.html
简单来说就是memset是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。如果你把1改成'1'将它变成字符,然后再printf("%c",ptr)的话能够打出1,但是这些数据是字符,不是整型数据,虽然不会报错但是还是有问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-16 09:27:49 | 显示全部楼层
dnfpk001 发表于 2017-5-27 13:49
第17行应该是:memset(ptr, 0, NUM*sizeof(int));
因为第3个参数n是:指定要填充的指向s空间的钱n个字节, ...

正解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-17 22:54:20 | 显示全部楼层
没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-4 15:42:51 | 显示全部楼层
memset与melloc并用即为celloc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-20 21:33:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 12:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表