memset()及相关函数用法及注意事项

【C语言】memset(含常见用途、注意事项) 场景 示例代码初始化数组 memset(arr, 0, sizeof(arr))清零动态内存 memset(ptr, 0, size * sizeof(int))初始化结构体 memset(&struct, 0, sizeof(struct))填充非零值 memset(arr, 1, sizeof(arr))通过 memset,可以快速初始化或填充内存区域,但需注意其按字节填充的特性。 阅读详情

memset()及相关函数用法及注意事项

1、memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。

其原型是:void* memset(void *_Dst, int _Val, size_t _Size);

使用时在文件头加上#include "stdlib.h" 。

_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数 。

===========================================================

char Array[12];
memset(Array,0,strlen(Array));
int Result = 0;
if(!Array)
{
   Result = 1;
}
程序执行到最后,Result的值还是为0.
    memset函数的原型是void *memset(void *dest,int c,size_t count );它的作用只是把dest的内存块中的元素的值都设置为c,并非是将dest置为NULL(虽然NULL的定义是0);NULL是个特殊的类型,它的值是'\0',我们可以把它理解为一个指针常量,但绝不是空,编译器对它是保护的,大多数我们用它来做边界条件。memset(Array,0,strlen(Aarray))这句只是把Array所占用的内存用0来初始化,并非将Array置为NULL;memset只是针对某一内存块中元素的值,而非地址;所以要想让Result的值为1,必须把条件由Array变为Array[0].

     同样在这里要注意的是我们不能改变常量,否则会报错,所以当这样写:char *ch = "1234"; memset(ch,0,strlen(ch)),虽然编译可以通过,但是不能运行,memset函数采用的值传递的方式传参,由于我们把一个常量赋给一个变量是非法的,这样会导致改变常量的内容。
==============================================================================


例1:

       char str[9];

       我们用memset给str初始化为“00000000”,用法如下

       memset(str,0,8);

         

注意,memset是逐字节 拷贝的。


下面再看一个例子:


    例2:

       int num[8];

       我们用memset给str初始化为{1,1,1,1,1,1,1,1},

       memset(num,1,8);//这样是不对的


     一个int是4个字节的,8个int是32个字节,所以首先要赋值的长度就不应该为8而是32。

     因为memset是 逐字节 拷贝,以num为首地址的8字节空间都被赋值为1,

     即一个int变为0X00000001 00000001 00000001 00000001,显然,把这个数化为十进制不会等于1的。


     所以,在memset使用时要千万小心,在给char以外的数组赋值时,只能初始化为0或者-1。因为在计算机里,0的二进制都是0,-1的二进制都是1。


     最近才发现memset的这个问题,之所以要写这篇文章,是因为我在自己的DES算法里多处用到了memset,而我当时却不知memset有这个问题,特此记下,引以为鉴。

---------------------

例如:

#include "stdio.h"
#include <string.h>
int main()
{ 
   char s[]="Golden Global View";
  cout<<"1: "<<s<<endl;
  memset(s,'G',6);
  cout<<"2: "<<s<<endl;
  system("pause");
  return 0;
  

}

结果

----------

2. memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);


3. memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’;例:char a[100];memset(a, '\0', sizeof(a));

memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。

strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。


4.补充:一点心得
memset可以方便的清空一个结构类型的变量或数组。

如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};

对于变量
struct sample_strcut stTest;

一般情况下,清空stTest的方法:
stTest.csName[0]='\0';
stTest.iSeq=0;
stTest.iType=0;

用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));

如果是数组:
struct sample_struct TEST[10];
则
memset(TEST,0,sizeof(struct sample_struct)*10);


5.strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#i nclude
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
memset
原型:extern void *memset(void *buffer, int c, int count);
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。 

C语言memset()函数详解 传递时,每个字节都将被设置为该值的低字节。如果要给整型数组赋值,建议使用循环遍历数组并逐个为数组元素赋值的方式,以确保每个数组元素都被正确设置。通过指定要设置的值,可以灵活地将其应用于不同类型的数据结构和内存块。函数时要保证操作的内存块有效并且足够大,以避免访问非法内存区域或导致缓冲区溢出等问题。是一个 C 语言中的库函数,用于将指定的内存块设置为指定的值。函数的主要功能是将指定的内存块的每个字节设置为给定的值。需要注意的是,我们传递的是结构体变量的地址(的所有元素设置为 0。的所有元素设置为 10。 阅读详情

相关推荐

一次搞定memset函数!

memset函数,一篇速通!

qq_74292674的博客 9602

一文搞定之memset函数

记录对memset函数的理解

树欲静静风不止止的博客 1万+

memset()的效率以及源码分析

void *memset(void *s, int c, size_t n); 作用:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作。 不知道有没有像我一样把memset当作万能的初始化工具,例如: int arr[n]; memset(arr,1,n*sizeof(int)); 这样得到的ar

编程新手的blog 1689

memset的用法详解

文章目录memset简介需要说明的几个地方不能任意赋值注意所要赋值的数组的元素类型关于所要赋值的字符数的写法具体用法实例总结 memset简介 memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。 void *memset(void *s, int c, size_t n); s指向要填充的内存块。 c是要被设置的值。 n是要被设置该值的字符数。 返回类型是一个指向存储区s的指针。 需要说明的几个地方 不能任意赋值 memset函数是按照字节对内存块进行初始化,所以不能用它将in

薛定谔的猫的博客 32万+

Kettle安装与使用

Pentaho Data Integration作为一个端对端的数据集成平台,可以对多种数据源进行抽取(Extraction)、加载(Loading)、数据落湖(Data Lake Injection)、对数据进行各种清洗(Cleasing)、转换(Transformation)、混合(Blending),并支持多维联机分析处理(OLAP)和数据挖掘(Data mining)。勺子(spoon.bat/spoon.sh):是一个图形化的界面,可以让我们用图形化的方式开发转换和作业。

jnrjian的博客 1万+

CFD-POST中建立变量的方法

本文以测量文丘里管中全压为例阐述CFD_POST中建立变量的方式 点击进入CFD-POST界面的expressions栏中 2.与expression栏中空白处右键,new-输入新建的表达式名称 3. 在下方的空白栏中右键-varible选择需要的变量,并根据公式进行修改 4.点击进入varibles栏,空白处右击-new-输入变量名totalpressure,在下拉框中找到之前定义的totalpressure 完成后可以在varibles栏中看到新建的...

sidxi的博客 1万+

memset()相关使用

1、memset函数及其用法 每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。 它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为: # include <string.h> void *memset(void *s, int c, unsigned long n); 函数的功能是: 将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是

xuyin1204的博客 3万+

MaxKey+JeecgBoot单点登录实战:手把手教你从零配置到账户同步

本文提供MaxKey与JeecgBoot单点登录(SSO)的实战整合指南。详细讲解从MaxKey应用注册、JeecgBoot前后端改造,到最终实现账户同步的完整步骤,重点解决Shiro配置、令牌交换等关键问题,帮助企业构建统一、可扩展的身份管理体系。

weixin_29258297的博客 542

使用memset()函数初始化二维数组时的注意事项

【注意事项】 使用memset()函数初始化二维数组时要千万小心: 1.二维整型数组利用memset()函数初始化时,只能初始化为0或者-1,否则二维整型数组的值将为随机数。 2.二维char数组利用memset()函数初始化时不受限制,可初始化为任意字符。 【算法代码】 #include <bits/stdc++.h> using namespace std; const int m=3; const int n=5; char a[m][n]; int main() { memse

hnjzsyjyj的专栏 1万+

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

前后端面试题【目录】

工作时候扭螺丝,面试时候造火箭,现状就是如此。不管是背八股文,还是掌握了知识的精华,对答如流才是硬道理。本专栏就是要集具前端精华,规范、算法、架构、封装、原理等一并汇集,让前端的小伙伴有个思路。, 欢迎一起交流,并非常期望您能够提供有价值的学习资料。

大剑师兰特的GIS世界 1836

C语言memset函数详解:高效初始化内存的利器

memset函数是C语言中高效操作内存的利器,广泛用于数组、结构体和动态内存的初始化。通过合理设置缓冲区大小和字节值,memset可以快速清零或填充内存,显著提高程序效率。然而,开发者需注意其字节级操作特性,避免对多字节类型设置非零值导致的错误。希望本文能帮助你深入理解memset函数的用法和注意事项!在实际开发中,结合sizeof和错误检查,memset将成为你处理内存初始化的得力助手。如果有更多关于C语言内存操作的问题,欢迎随时探讨!

weixin_52734695的博客 3021

虚拟电厂功率预测最佳实践白皮书

虚拟电厂(VPP)通过聚合分散的可再生能源资源,为电网提供可观测、可调度和可交易的解决方案。本文提出了一套功率预测方法论,并给出LSTM实现脚本,涵盖资源接入、数据治理、预测模型设计及市场交易闭环。针对风-光-储-负荷混合场景,该方法论强调轻量化部署和滚动优化,可有效提升预测精度和调度收益。未来研究将融合深度气象预报和强化学习,进一步优化VPP的协同调度能力。

专注AI大模型,软件混淆,授权 377

malloc、free函数及memset函数用法详解

最近在力扣刷题时,发现普通的创建数组很容易引起编译器报错。而使用到动态内存分配malloc()函数和初始化函数memset()可以避免这类问题的发生。本文将详细介绍一下两个函数的用法。

hyz529900的博客 5173

FPGA实现串口的任意字节数接收

基于FPGA的任意字节数(单字节、多字节)的串口(UART)接收,真的不来看看吗?

孤独的单刀 1万+

基于DSIFT多尺度图像融合的MATLAB代码

多尺度图像融合是一种常用的图像处理技术,它可以将具有不同尺度和空间频率特征的图像融合成一幅更具信息丰富度和视觉效果的图像。DSIFT算法是一种基于SIFT算法的改进版本,它在提取图像特征时采用了密集采样的方法,能够有效地提取图像的局部特征。多尺度图像融合基于DSIFT算法的思想,通过在不同尺度下提取图像的DSIFT特征,并将这些特征进行融合,得到最终的融合图像。然后,通过DSIFT算法提取了两幅图像的特征。通过运行上述代码,我们可以在MATLAB中实现基于DSIFT多尺度图像融合的算法,并观察到融合结果。

IELLQUI9的博客 181

内存内容操作函数详解[4]:memset()

在 C 语言的内存操作函数家族中,memset () 是最基础也最常用的函数之一。它看似简单 —— 将一块内存区域填充为指定的值,但却在程序初始化、数据清除、缓冲区准备等场景中发挥着不可替代的作用。然而,这个看似平凡的函数背后隐藏着许多容易被忽视的细节和潜在风险。

byte轻骑兵的技术小窝 7017

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c语言memset函数用法,深入学习C语言中memset()函数的用法

头文件:#include memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为:void * memset( void * ptr, int value, size_t num );参数说明:ptr 为要操作的内存的指针。value 为要设置的值。你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转...

weixin_39530557的博客 439

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

memset函数

【代码】memset函数。

2301_80045122的博客 1733

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言专题之常用内存相关函数

在这个示例中,str1 和 str2 的前五个字节不完全相同('l' 和 'o' 的区别),因此 memcmp 返回一个非零值。memset函数用于将一块连续的内存区域中的所有字节设置为指定的值,注意是字节。memcmp 是一个强大且灵活的函数,它能够准确比较两个内存块的前 n 字节,非常适合用于需要逐字节精确比较的场景。当你使用 memset 时,需要确保你知道所使用的值在目标类型的上下文中是如何解释的。2.c: 要填充在每个字节中的值(注意:传入的是 int 类型,但实际填充的是该值的低8位)。

2401_89278589的博客 2408

c++ memset 语言_C++_深入学习C语言中memset()函数的用法,头文件: #include <string.h& - phpStudy...

深入学习C语言中memset()函数的用法头文件:#include memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为:void * memset( void * ptr, int value, size_t num );参数说明:ptr 为要操作的内存的指针。value 为要设置的值。你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和...

weixin_39665992的博客 1193

c语言中memset_C中的memset()

c语言中memsetThe memset() function in C is used to set blocks of memory with a particular value. C语言中的memset()函数用于设置具有特定值的内存块。 In this article, we’ll have a look at how we can use this function in C pro...

从零开始的教程世界 5188

记录| C++中memset()函数用法;函数定义后面加const用法;

如上述代码示例,一般函数参数后面加上const后,该类的成员变量若是在该函数内调用使用,则不能进行参数赋值和修改,只能作为判断参数使用,这样保证了程序结构的安全和严谨性;eg:错误使用方式如下。age成员函数不能增加age+=10;return age;

Howeedang的博客 309

memset()函数的实现

memset()函数的实现。

zhyjhacker的博客 337

C++中memset的用法

memset

qq_35763737的博客 2100

memset函数注意事项

memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。     其原型是:void* memset(void *_Dst, int  _Val, size_t _Size);     使用时在文件头加上#include "stdlib.h" 。     _Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数 。   例1:        ch

u013177568的专栏 431
上一篇: VS2003试图运行项目时出错:无法启动调试 没有正确安装调试器
下一篇: error C2018
wangrouyi
博客等级 码龄16年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值