为什么memset不能将数组元素初始化为1?(急)

C++学习——memset函数详解 memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。 头文件 <string.h>或 < cstringh > 函数介绍 void *memset(void *s, int ch, size_t n); 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int si... 阅读详情
AI摘要

本文探讨了C++中memset()函数的正确使用方法,包括初始化不同类型数组时的注意事项、结构体中包含指针时的初始化风险及存在虚函数时的异常问题。

在C++中 memset() 可以将数组每个元素初始化为-1 0 false true 这个我们经常用,是可以的,但是昨天将数组元素初始化为1 就出错了。全部变成了168009!不知道是怎么一回事?大虾们能否给指点迷津?

很简单memset是一个字节一个字节的设置,把一个int的每个字节都设置为1,也就是0x01010101,十进制就是16843009
前段项目中发现一个问题,程序总是在某个dynamic_cast进行动态转换时出异常,查了半天才发现问题原来是出在memset的使用上,虽然问题本身显而易见,但当处于几十万行代码量级中时,就变得不太那么容易定位了。
本文归纳了下使用memset几个需要注意的地方,虽然内容很简单,但也希望对大家有所帮助。

1. memset是以字节为单位,初始化内存块。
当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如,
  1. char data[10];  
  2. memset(data, 1, sizeof(data));    // right  
  3. memset(data, 0, sizeof(data));    // right  
而在初始化其他基础类型时,则需要注意,比如,
  1. int data[10];  
  2. memset(data, 0, sizeof(data));    // right  
  3. memset(data, -1, sizeof(data));    // right  
  4. memset(data, 1, sizeof(data));    // wrong, data[x] would be 0x0101 instead of 1  
2. 当结构体类型中包含指针时,在使用memset初始化时需要小心。
比如如下代码中,
  1. struct Parameters {  
  2.           int x;  
  3.           int* p_x;  
  4. };  
  5. Parameters par;  
  6. par.p_x = new int[10];  
  7. memset(&par, 0, sizeof(par));  
当memset初始化时,并不会初始化p_x指向的int数组单元的值,而会把已经分配过内存的p_x指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,显而易见也是不应该使用memset来初始化的。

3. 当结构体或类的本身或其基类中存在虚函数时,也需要谨慎使用memset。
这个问题就是在开头项目中发现的问题,如下代码中,
  1. class BaseParameters  
  2. {  
  3. public:  
  4.     virtual void reset() {}  
  5. };  
  6.   
  7. class MyParameters : public BaseParameters  
  8. {  
  9. public:   
  10.     int data[3];  
  11.     int buf[3];  
  12. };  
  13.   
  14. MyParameters my_pars;  
  15. memset(&my_pars, 0, sizeof(my_pars));  
  16. BaseParameters* pars = &my_pars;  
  17.   
  18. //......  
  19.   
  20. MyParameters* my = dynamic_cast<MyParameters*>(pars);  
程序运行到dynamic_cast时发生异常。原因其实也很容易发现,我们的目的是为了初始化数据结构MyParameters里的data和buf,正常来说需要初始化的内存空间是sizeof(int) * 3 * 2 = 24字节,但是使用memset直接初始化MyParameters类型的数据结构时,sizeof(my_pars)却是28字节,因为为了实现多态机制,C++对有虚函数的对象会包含一个指向虚函数表(V-Table)的指针,当使用memset时,会把该虚函数表的指针也初始化为0,而dynamic_cast也使用RTTI技术,运行时会使用到V-Table,可此时由于与V-Table的链接已经被破坏,导致程序发生异常。

为什么memset只能赋值为0或-1 问题引出 当我们运行下面的一段代码试图将数组中的数字全置为1: #include<bits/stdc++.h> using namespace std; int main() { int arr[5],b; memset(arr,1,sizeof(arr)); for(auto i:arr) cout<<i<<" "; } 会发现结果为:16843009 16843009 16843009 16843009 16843009 为什么结果会与我们预期不符? 原 阅读详情

相关推荐

关于C++中的memset用法介绍

memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。s指向要填充的内存块。c是要被设置的值。n是要被设置该值的字符数。返回类型是一个指向存储区s的指针。需要说明的几个地方memset函数在初始化处理时非常方便,但也有其局限性,比如要注意初始化数值,要注意字节数等等。当然,直接选择用for循环或while循环来进行初始化也是可以的,只不过memset更快捷一些。微点阅读。

xinyuerr的博客 532

c++入门必学库函数 memset

一、memset的介绍memset是c语言的string.h里的字符串初始化函数,但是也经常于普通数组的初始化,它的优点就是简单易用,一行代码就可以初始化数据了,当然这完全可以用for循环赋值代替的。二、memset的基本用法函数模板:memset(数组首地址,初始值,初始化大小)数组首地址:数组的首地址是可以直接用数组名代替的初始值: 初始值的范围是0到127,因为memset是以字节为单位对数组进行赋值的,一个字节8位,所表达的值就是0到127 初始化大小: 初始化大小用一个整数表

weixin_52115456的博客 1万+

memset初始化详解

参考文档 Function void * memset ( void * ptr, int value, size_t num ); Fill block of memory Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted ...

i逆天耗子 6127

C++ memset() 详解

菜鸟教程 memset 1️⃣C++中memset()用法 memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组 c:是赋给buffer的值 count:赋值buffer中的位数 1. memset是以字节为单位,初始化内存块。 当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如, char data[10]; memset(data, 1, sizeof(d

Syntactic Sugar 4808

memset不能将数组元素初始化为1的原因

memset是一个字节一个字节的设置,把一个int的每个字节都设置为1,也就是0x01010101,(十六进制1位是二进制4位,两位是二进制8位,是1字节)十进制就是16843009 memset是以字节为单位,进行初始化 当初始化char类型数组 初始化多少都可以 char data[10]; memset(data,0,sizeof(data)); // right memset(...

weixin_45672677的博客 720

Android Geckoview实战:5分钟搞定JS与原生交互(附完整Demo代码)

本文详细介绍了在Android应用中使用GeckoView替代系统WebView,构建稳定高效的JavaScript与原生代码交互桥梁的实战方法。通过WebExtension架构,文章提供了从环境配置、扩展开发到Android端集成的完整步骤,并附有可运行的Demo代码,帮助开发者快速解决混合应用中的兼容性问题。

u5v6w7的博客 934

int数组为什么一般不能用memset初始化每个元素

对于整数型数组,若要是初始化为非0的值时应该使用for循环 而对于字符型 或 0  应该使用memset 函数 如下是可以的,能把数组中的元素值都设置成字符1, #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main() { char a[5]; memset(a,'1'...

qq1169091731的博客 7597

WhatsApp协议算法

我想其实有很多人还不太了WhatsApp群控,简单来说,它和我们常使用的微信聊天软件是类似的,只不过它是基于通讯录的,操作起来比较简单便捷,所以现在有很多国家都喜欢用WhatsApp。一般情况下,筛号不会造成账号被封的情况,但是呢,如果筛号的频率太快,就会被系统限制筛号能力,不再返回筛号结果,所以,筛号数量和速度一定要控制好。前天逛街突然灵光一现,为什么不试试多路访问呢,简单来说就是信道复用技术,马上跑回家,调取接口,接入通道,导入已经转换成协议的账号,成功登录!

2403_87755661的博客 1942

关于memset函数初始化数组的“坑”

我们知道,memset函数可以用来把一整块内存全部初始化,一般常用于数组。请看下面的代码 我们定义了一个大小为5的int型数组,意在把数组中的每一个元素都初始化为1。 #define _CRT_SECURE_NO_WARNINGS 1 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;string.h&gt; //初始化...

melody_1016的博客 8013

Win10系统内存占用异常飙升?三步排查法快速定位问题根源

本文针对Win10系统内存占用异常飙升问题,提供了一套三步排查法。首先利用任务管理器和资源监视器进行深度系统体检,定位隐形内存消耗者;其次通过干净启动和禁用非必要后台服务,揪出导致内存泄漏的第三方软件或驱动;最后进行终极深度清理,包括检查内存完整性、调整虚拟内存设置以及更新关键驱动程序,帮助用户快速恢复系统流畅运行。

weixin_29251567的博客 195

麒麟操作系统安装达梦数据库ARM版

Linux安装达梦数据库ARM版

运维@小兵的博客 8769

为什么memset不能将数组元素初始化为1?

今天笔者发现了一个很严肃的问题 memset函数不能给数组赋值为1 查阅资料后发现,memset函数是逐个字节填充,计算机中为补码,memset函数只能填充为全0或者全1。 说明,memset函数只能给数组赋值全0,或者全-1. #include<string.h> int main(){ int a[101]; memset(a,1,sizeof(a)); for(int i=...

practical_sharp的博客 1926

【零基础入门哈希签名架构,从Lamport到SPHINCS+】第二集 哈希签名树 Merkle Tree Authentication

在第一集中,我们一直忽略了一个问题。设想一下,假如有一个Hacker(黑客),在截获到Sender发送给Receiver的公钥之后,把这个公钥改成Hacker自己的公钥,然后再发给Receiver,那么Receiver就会误认为这是Sender的公钥。所以我们之前所说放方案,其安全性都需要建立在一个前提下:Receiver需要确认公钥确实是Sender发出的。

m0_50572808的博客 2452

C++:用memset初始化数组

1、初始化数组 定义完数组之后有三种初始化方式 int A[20]={0}; int A[20]; for(i=0;i<sizeof(A)/A[0];i++) A[i]=0; int A[20]; memset(A, 0, sizeof(A)); 此外对于全局变量和静态变量在定义之后会由编译器自动初始化为0 2、关于memset初始化与赋值问题 memset是C/C++提供的函数初始化函...

dashumak的博客 2万+

组建高效AI开发团队:角色、技能与协作

在当今科技飞速发展的时代,人工智能(AI)已经成为各个领域的核心驱动力。组建高效的AI开发团队对于企业和科研机构来说至关重要,它能够推动创新、提高竞争力、实现业务目标。本文的目的在于为那些希望组建或优化AI开发团队的管理者、技术负责人以及相关从业者提供全面的指导。范围涵盖了团队角色的定义、所需技能的分析、团队协作的策略,以及实际项目中的应用和相关资源的推荐。本文将首先介绍AI开发团队的核心概念与联系,包括团队角色、技能和协作之间的关系。接着阐述核心算法原理和具体操作步骤,结合数学模型和公式进行详细讲解。

2502_91592937的博客 995

SAP Joule Studio 全景解析

摘要:SAP Joule Studio是SAP Build平台中的低代码/专业级复合工作台,用于构建和管理企业专属的Joule智能体与技能。它支持通过拖拽和声明式编排实现跨系统任务自动化,与SAP及第三方系统集成。核心构件包括Agent(智能体)、Skill(技能)、Action(动作)和Project(项目)。Joule Studio强调企业级落地,与SAP Build Process Automation等工具协同,实现从设计到运行的全生命周期管理。典型应用场景包括供应链补货、财务关账和人力服务台自动化

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 391

【C++的一个坑】int数组初始化为全0和全1,bool数组初始化为全false和全true

看到C++将数组初始化为全0的这个用法: int a[100] = {0};// 初始化一个全0的数组 你可能会举一反三,使用如下代码来初始化一个全1数组 int a[100] = {1}; 但是这句代码的执行结果是:得到一个第一个数为1,其他数全部为0的数组。感觉非常坑爹。 究其原因,正如C/C++ int数组初始化中所述,数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值...

爱兜风的博客 3万+

条件DDPM:Diffusion model的第三个巅峰之作

前言:DDPM从2020年诞生,短短一年的时间,模型上有两个巨大的改进,其中一个就是condition的引入,最近大部分DDPM相关的论文都会讨论这一点,有些文章称之为latent variable。和当年GAN的发展类似,CGAN和DCGAN的出现极大程度上促进了GAN的发扬光大,意义重大。本文基于前面几篇文章继续聊一聊: 从VAE到Diffusion Model_沉迷单车的追风少年-优快云博客 为什么diffusion model扩散模型可以称为score-based models?_沉迷单车的.

沉迷单车的追风少年 1万+

使用memset()函数初始化二维数组

【注意事项】 1.二维整型数组直接利用 memset() 函数初始化时,只能初始化为 0 或 -1 ,否则将会被设为随机值。 2.二维 char 型数组利用 memset() 函数初始化时不受限制,可以初始化任意字符。 二维整型数组 #include<stdio.h> #include<string.h> int main() { int a[10][10]; memset(a,0,sizeof(a)); for(int i = 0;i < 10;i++) { fo

qq_53269459的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[原创]使用memset初始化数组为-1或…

相信很多人使用过memset来初始化数组为-1或0。 这时候数组元素正好是-1或0。 今天看了memset的效率问题后,才想起这是个恰巧。 之前一直以为memset是对每个元素赋值,而实际不是的。 百度百科中的memset: void *memset(void *s, int ch, size_t n); 将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 块的大

Never too late! 6400

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

memset初始化数组易错点

memset(a, 1, sizeof a); 如下代码,不少同学会以为a[]被初始化为1,其实不是的,是被初始化为16843009,为什么是这个数呢? #include <bits/stdc++.h> using namespace std; int n, a[14]; int main() { memset(a, 1, sizeof a); for(int i=0; i<14; ++i){ cout << a[i] << endl; } ret

ypeijasd的专栏 1279

memset函数不能给int(整型)数组初始化赋值

如下demo是可以的,能把数组中的元素值都设置成字符1, #include #include using namespace std; int main() {     char a[5];     memset(a,'1',5);     for(int i = 0;i       cout ";     system("pause");     return 0;

永久指针 5361

使用memset初始化数组

写在前面的ATTENTION:用memset初始化非char型(eg. int型、float型…)数组时,假如初始化值非0,可能导致错误的结果。 先举个通常用法的栗子, 将int型数组arr的元素初始化为0: int arr[5]; memset(arr, 0, sizeof(int) * 5); 假如初始值不为0,会如何呢?例如设置为1: 使用memset(arr, 1, sizeof(int...

随便写写 3733

【转】memset()不能初始化为1

#include <stdio.h> #include <string.h> int main() { int array[5]; int a; while(~scanf("%d",&a)){ memset(array,a,sizeof(array)); printf("%d %d\n",a...

桺柒郞的小小屋 950

为什么memset不能将数组元素初始化为1

来自点击打开链接.byhang问题代码:#include <stdio.h>#include <string.h>int main() { int array[5...

拔剑四顾心茫然的博客 426
上一篇: 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
下一篇: 特征值和特征向量的实际意义
PengPengBlog
博客等级 码龄10年 178粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值