memset函数总结
之前有一个程序栽在了memset函数上面,对memset函数一直耿耿于怀,于是想总结一下这个常用但是总出错的函数。
memset在string.h文件中是这么定义的:
void*代表这个函数的返回值可以是任意类型的指针。
_cdecl是C Declaration的缩写,表示C语言默认的函数调用方法。该方法具体为:所有参数从左到右依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会调用调用者传递多少参数,调用者传递过多或过少的参数,甚至完全不同的参数都不会产生编译阶段的错误(转自百度百科)。
紫色部分_Out_writes_bytes_all_与 _In_是微软的源代码注释。
第一个参数是任意类型的指针。第二个参数是所赋的值。第三个参数是字节大小。
整个函数的含义就是将_Dst中的前_Size多的字节赋值为_Val,并返回修改后的_Dst。
这里要注意:memset函数中的_size是以字节为单位的。举例:
#include <iostream>
#include <cstring>
using namespace std; int main()
{
char a[5];
memset(a,'v',5); cout<<a[0]<<endl;
cout<<a[1]<<endl;
cout<<a[2]<<endl;
cout<<a[3]<<endl;
cout<<a[4]<<endl; system("pause");
return 0;
}
结果:
memset(a,'v',5);这里的第三个参数直接是5,没有给任何单位,就可以成功将char a[5]成功赋值说明memset是对字符型操作的。
所以说这样的情况
#include <iostream>
#include <cstring>
using namespace std; int main()
{
int a[5];
memset(a,10,5); cout<<a[0]<<endl;
cout<<a[1]<<endl;
cout<<a[2]<<endl;
cout<<a[3]<<endl;
cout<<a[4]<<endl; system("pause");
return 0;
}
就会出现这样的情况:
那这样呢
#include <iostream>
#include <cstring>
using namespace std; int main()
{
int a[5];
memset(a,10,5*sizeof(int)); cout<<a[0]<<endl;
cout<<a[1]<<endl;
cout<<a[2]<<endl;
cout<<a[3]<<endl;
cout<<a[4]<<endl; system("pause");
return 0;
}
还是不对:
然后我就思考一下为什么,觉得应该是这样
看第一个实例memset(a,10,5)。因为memset是以字节为单位的,所以其含义就是int a[5]。以地址a起始,5个字节都要赋值为10。
这样的话,a[0]=0x0A0A0A0A,即为168430090
a[1]=0xXXXXXX0A
a[2]没赋值
a[3]没赋值
a[4]没赋值
a[5]没赋值。所以会出现上面的情况。
而第二个例子memset(a,10,5*sizeof(int))。
无非还是以字节为单位赋值了20个字节,
a[0]=0x0A0A0A0A
a[1]=0x0A0A0A0A
a[2]=0x0A0A0A0A
a[3]=0x0A0A0A0A
a[4]=0x0A0A0A0A,出现的结果即都是168430090。
所以说,我觉得除了char数组,其余的(比方说struct,int[])用memset函数均需要小心谨慎,今天写一个程序就栽在这里了,特地写一篇总结。但后来发现memset函数还有成功的时候,就是
int a[10];
memset(a,0,10*sizeof(int));
哈哈,原理自不必说了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
memset函数总结的更多相关文章
- memset函数详解
语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...
- 深入学习 memset 函数
最近,和同学讨论了一下memset函数,趁着周五空闲做一总结. memset函数最常用的功能就是初始化数组了(主要是置零),如 #include <iostream> #include & ...
- strcpy, memcpy, memset函数
一. strcpy函数 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 和 #inclu ...
- memset函数具体说明
1.void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c. 2.样例#include void main(){char ...
- C/C++中memset函数
本文学习参考http://baike.baidu.com/link?url=ZmSyY8ciB_nJt9KM-W2fiEFJrC2mugFsLqRdY2b4pLe8rD_jRXyN7_pj0GBBD2 ...
- C语言中的memset函数和数组指针
代码: #include <iostream> #include <cstring> using namespace std; int main(){ ] = {}; mems ...
- memset函数的使用
void *memset(void *s, int ch, size_t n); 说明:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 关于mem ...
- c/c++学习系列之memset()函数
[转载] memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *mems ...
- 关于memset函数--赋最大值
问题起源: 这几天在刷CCF的时候,图论那边经常用到赋最大值,一开始自己一直手工for循环赋值(INT_MAX或者是LONG_LONG_MAX),后来看到别人的代码,发现了一个比较高端的赋值 mem ...
- memset函数用法
1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组 c:是赋给buffer的值 cou ...
随机推荐
- MyBatis 入门Demo
新建数据库my_db,新建表student_tb id为主键,不自动递增. 不必插入数据. 下载MyBatis https://github.com/mybatis/mybatis-3/release ...
- windows下创建/删除服务
windows下创建/删除服务 1. windows下创建/删除服务 1.1. 创建服务 命令格式: sc [servername] create Servicename [Optio ...
- 利用正则表达式判断Java中的秒钟、分钟、小时、日、月是否符合规则
// 定义校验规则 Pattern patRule = Pattern.compile("判断规则"); // 校验结果 patRule.matcher("判断的对象&q ...
- python中numpy.concatenate()函数的使用
numpy库数组拼接np.concatenate 原文:https://blog.csdn.net/zyl1042635242/article/details/43162031 思路:numpy提供了 ...
- 【PAT甲级】1015 Reversible Primes (20 分)
题意: 每次输入两个正整数N,D直到N是负数停止输入(N<1e5,1<D<=10),如果N是一个素数并且将N转化为D进制后逆转再转化为十进制后依然是个素数的话输出Yes,否则输出No ...
- C++面试常见问题——04链表的逆序与合并
链表的逆序与合并 链表的逆序 已知一个链表的头指针为head,将该链表逆序. #include<iostream> using namespace std; struct Node{ in ...
- 「Luogu P3168 [CQOI2015]任务查询系统」
介绍本题的两种做法: 方法1 前置芝士 线段树:一个很重要的数据结构. 树状数组:一个很重要的数据结构. 具体实现 区间修改,单点查询很容易就会想到树状数组了,至于查询前k个数的和又可以丢给权值线段树 ...
- SystemVerilog for design 笔记(二)
转载请标明出处 1. System Verilog文本值和数据类型 1.1. 增强的文本值赋值 相对于verilog,SV在文本值赋值时可以1.无需指定进制 2.赋值可以是逻辑1 用法: reg ...
- 34 java 文件过滤 FileFilter
package com.da.tool.util; import org.apache.commons.io.filefilter.RegexFileFilter; import java.io.Fi ...
- SpringBoot项目中自定义注解的使用
1.定义注解接口 @Documented @Retention(RUNTIME) @Target(METHOD) public @interface MyLog { String value() ...