小甲鱼 发表于 2016-12-15 23:12:10

memset -- 使用一个常量字节填充内存空间

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;
}

流月飞星 发表于 2016-12-15 23:33:12

占楼{:10_256:}

Ra1nb0w 发表于 2017-4-26 10:42:43

mark{:10_257:}

dnfpk001 发表于 2017-5-27 13:49:31

第17行应该是:memset(ptr, 0, NUM*sizeof(int));
因为第3个参数n是:指定要填充的指向s空间的钱n个字节,单位是字节

chopsticks 发表于 2017-7-17 22:46:52

{:5_92:}learn more

DASHUAIZI 发表于 2018-7-21 20:23:30

{:10_266:}

江南盛景 发表于 2019-3-19 17:27:53

第17行应该是memset(ptr,0,NUM * sizeof(int))吧!如果是memset(ptr,0,num)只有前25个字节的数据清零了,我的int型占4字节。

散步去看雨 发表于 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);   
      
    }
    printf("\n");

    free(ptr);

    return 0;
   
}

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


为什么这样?只是想填充1

散步去看雨 发表于 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);   
      
    }
    printf("\n");

    free(ptr);

    return 0;
   
}


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

18186881740 发表于 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);
        }
        free(p);
        return 0;
}

memset(p,1,4*sizeof(int))中我把‘ 0’ 改为‘ 1 ’ ,为什么打印出来的不是1;
求解!!!!!!!!!!!!!!!

shatanzongcai 发表于 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,但是这些数据是字符,不是整型数据,虽然不会报错但是还是有问题。

Lowell 发表于 2020-10-16 09:27:49

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

正解!

学C的大叔 发表于 2021-3-17 22:54:20

没看懂

Sherry笑 发表于 2023-1-4 15:42:51

memset与melloc并用即为celloc

神宫 发表于 2023-2-20 21:33:27

{:10_250:}
页: [1]
查看完整版本: memset -- 使用一个常量字节填充内存空间