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;
}
占楼{:10_256:} mark{:10_257:} 第17行应该是:memset(ptr, 0, NUM*sizeof(int));
因为第3个参数n是:指定要填充的指向s空间的钱n个字节,单位是字节 {:5_92:}learn more {:10_266:} 第17行应该是memset(ptr,0,NUM * sizeof(int))吧!如果是memset(ptr,0,num)只有前25个字节的数据清零了,我的int型占4字节。 #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 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 求解!!!!!!!!!!!!!!!
代码如下
#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;
求解!!!!!!!!!!!!!!! 18186881740 发表于 2020-2-23 15:18
求解!!!!!!!!!!!!!!!
代码如下
#include
朋友,具体解释看下面这个网站
https://www.cnblogs.com/youxin/p/3226817.html
简单来说就是memset是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。如果你把1改成'1'将它变成字符,然后再printf("%c",ptr)的话能够打出1,但是这些数据是字符,不是整型数据,虽然不会报错但是还是有问题。 dnfpk001 发表于 2017-5-27 13:49
第17行应该是:memset(ptr, 0, NUM*sizeof(int));
因为第3个参数n是:指定要填充的指向s空间的钱n个字节, ...
正解! 没看懂 memset与melloc并用即为celloc {:10_250:}
页:
[1]