鱼C论坛

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

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

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

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

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

x
memset 函数文档


函数概要:

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

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


函数原型:
#include <string.h>
...
void *memset(void *s, int c, size_t n);

参数解析:

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


返回值:

返回 s 指向的内存空间。


演示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUM 100

int main(void)
{
        int *ptr;

        ptr = (int *)malloc(NUM * sizeof(int));
        if (ptr == NULL)
        {
                exit(1);
        }

        memset(ptr, 0, NUM);

        return 0;
}

评分

参与人数 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 | 显示全部楼层
#
include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define NUM 10

int main(void)
{
    int i;

    int *ptr = NULL;
    ptr = (int *)malloc(NUM*sizeof(int));
    
    if(ptr == NULL)
    {
        exit(1);    
    }    
    
    memset(ptr,1,NUM);

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

    free(ptr);

    return 0;
    
}
运行结果:
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 个字节
初始化是以字节为单位而不是以元素为单位。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define NUM 10

int main(void)
{
    int i;

    int *ptr = NULL;
    ptr = (int *)malloc(NUM*sizeof(int));
    
    if(ptr == NULL)
    {
        exit(1);    
    }    
    
    memset(ptr,1,NUM*sizeof(int));

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

    free(ptr);

    return 0;
    
}

运行结果:
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[i])的话能够打出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-11-21 18:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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