memset字节级填充

一次搞定memset函数! memset函数,一篇速通! 阅读详情

memset:字节级内存填充

核心特点
  • 仅能按字节填充,因此仅适合填充「单字节值」(如0/-1);
  • 填充非单字节值(如1)会出错(因为每个字节填0x01,4 字节 int 会变成0x01010101=16843009)。
示例 1:数组清 0(最常用)
#include <cstring> // memset头文件
int main() {
    int arr[5];
    // 把arr的5个int(共20字节)每个字节填0
    memset(arr, 0, sizeof(arr)); 
    // arr所有元素为0

    char buf[100];
    // 字符数组清0(等价于buf[0]='\0',但清空整块内存)
    memset(buf, 0, sizeof(buf));
    return 0;
}
示例 2:填充 - 1(特殊值,字节全为 0xff)
int arr[5];
// -1的补码是0xff(单字节),填充后每个int的4字节都是0xff → 整数值为-1
memset(arr, -1, sizeof(arr)); 
反例(禁止):填充非单字节值
int arr[5];

第一步:先明确两个基础规则

1. int 类型的内存占用(32/64 位系统通用)

一个int变量在内存中占 4 个字节(32 位),可以把它想象成「4 个连续的小格子」,每个格子存 1 个字节(8 位)的数据。

比如定义int num;,它的内存布局是:

字节位置(假设)0x1000x1010x1020x103
存储内容????
2. memset 的工作规则:只认 “字节”,不认 “变量类型”

memset(ptr, c, n) 的逻辑是:

  • 从ptr指向的内存地址开始;
  • 把每一个字节都设置为c(c会被转成unsigned char,即 0~255 的数值);
  • 一共设置n个字节。

简单说:memset 不管你要填充的是int/char/double,它只会 “一个字节一个字节地填同一个值”。

第二步:拆解 “填充 1 出错” 的核心原因

我们以memset(arr, 1, sizeof(arr))为例(arr 是 int [5]):

1. 先看 “填充 1” 时,memset 做了什么?

memset接收的第二个参数是1,会先转成单字节值0x01(十六进制),然后给arr中每一个字节都填0x01。

2. 一个 int 元素的 4 个字节被填成了什么?

因为一个 int 占 4 字节,所以每个 int 元素的 4 个 “小格子” 都会被填0x01,内存布局变成:

字节位置0x1000x1010x1020x103
填充值0x010x010x010x01
3. 这个内存布局对应的 int 值是多少?

计算机按「十六进制→十进制」解析这个 4 字节的 int:

  • 十六进制整体:0x01010101(把 4 个字节拼起来);
  • 转十进制:1 + 1×256 + 1×256² + 1×256³ = 1 + 256 + 65536 + 16777216 = 16843009。

这就是为什么memset(arr, 1, sizeof(arr))后,int 数组的元素不是 1,而是 16843009!

第三步:对比理解 “0/-1 填充正常” 的原因

1. 填充 0(memset (arr, 0, sizeof (arr)))

每个字节填0x00,int 的 4 个字节都是0x00,拼起来是0x00000000,十进制就是 0(符合预期)。

2. 填充 - 1(memset (arr, -1, sizeof (arr)))

-1 的单字节补码是0xff(计算机中负数用补码存储),所以每个字节填0xff;

int 的 4 个字节都是0xff,拼起来是0xffffffff,这个值的补码解析后就是 - 1(符合预期)。

第四步:代码验证(跑一遍就直观了)

#include <cstdio>
#include <cstring>

int main() {
    int arr[3];
    
    // 测试填充0
    memset(arr, 0, sizeof(arr));
    printf("填充0后:arr[0] = %d\n", arr[0]); // 输出0
    
    // 测试填充-1
    memset(arr, -1, sizeof(arr));
    printf("填充-1后:arr[0] = %d\n", arr[0]); // 输出-1
    
    // 测试填充1
    memset(arr, 1, sizeof(arr));
    printf("填充1后:arr[0] = %d\n", arr[0]); // 输出16843009
    printf("十六进制:0x%x\n", arr[0]); // 输出0x01010101(验证字节填充结果)
    
    return 0;
}

总结:memset 的使用边界

填充值是否适合 memset原因
0✅所有字节填 0,任意类型变量解析后都是 0
-1✅所有字节填 0xff,任意类型变量解析后都是 - 1
1/2/3 等非 0/-1❌逐字节填充后,多字节变量(int/double)解析值≠目标值

如果想给 int 数组填充 1、2 这类普通数值,不要用 memset,改用循环或 C++ 的std::fill:

// 正确填充int数组为1的方式
int arr[5];
for (int i = 0; i < 5; ++i) {
    arr[i] = 1; // 每个int直接赋值1,而非逐字节填
}

// 或C++的std::fill(更简洁)
#include <algorithm>
std::fill(arr, arr+5, 1);
C/C++ memset函数详解与内存初始化实践 内存初始化是编程中的基础操作,memset作为C/C++标准库的核心函数,通过字节级操作实现高效内存填充。其底层原理是遍历目标内存区域,将每个字节设置为指定值,这种机制在缓冲区清零、模式填充等场景表现出色。在安全编程和性能优化领域,正确使用memset能有效防止未初始化内存导致的安全漏洞,同时利用SIMD等硬件加速特性提升执行效率。特别是在嵌入式系统和底层开发中,memset配合结构体初始化、内存池管理等技术,可确保关键数据结构的正确状态。本文通过典型应用案例和性能对比,深入解析如何避免常见的字节填充陷阱, 阅读详情

相关推荐

C语言memset的5个实战技巧:从数组清零到结构体初始化

本文深入探讨C语言中memset函数的5个核心实战技巧,从理解其字节操作本质到高效应用于数组清零、结构体初始化。文章详细解析了memset在动态内存管理(calloc对比)、调试边界标记、敏感信息清理及性能优化中的高级用法,帮助开发者避免常见陷阱,提升代码的健壮性与执行效率。

weixin_28318011的博客 229

C++中memset()函数的用法详解

头文件:cstring 或 memory 话说刚开始使用memset的时候一直以为memset是对每一个int赋值的,心里想有了memset还要for循环对数组进行初始化干嘛。但其实memset这个函数的作用是将数字以单个字节逐个拷贝的方式放到指定的内存中去 memset(dp,0,sizeof(dp)); int类型的变量一般占用4个字节,对每一个字节赋值0的话就变成了

lyj2014211626的博客 10万+

C语言内存函数详解:memcpy、memmove、memset、memcmp从入门到实战

在C语言开发中,内存操作是绕不开的核心技能。与字符串函数不同,内存函数将数据视为裸字节,通过void*指针和size_t长度精确控制操作范围,从而实现任意类型的拷贝、填充与比较。memcpy高效但要求内存区域不重叠,memmove则安全处理重叠场景,memset用于快速清零缓冲区,memcmp用于逐字节比较数据块。理解这些函数背后的指针语义与边界条件,能帮助开发者规避缓冲区溢出、内存重叠错乱等隐蔽问题。无论是对结构体做初始化、在数组间搬移元素,还是解析网络报文中的类型双关,内存函数都是工程实践中不可或缺的工

weixin_32667955的博客 73

关于memset

总所周知,memset的作用是初始化函数,将某一块内存中的内存全部设置为指定值; 这次想提的是容易犯错的两个点: 1.memset初始化的最小单是字节,因此在初始化int类型的数组的时候,只能将其初始化为0或者-1; 比如将其初始化为1时,1的二进制序列 0000 0001,int类型4个字节,那么会将其初始化为 0000 0001 0000 0001 0000 0001 0000 0001,很显然与原意不符,使用时需要特别注意; 2.注意,每次赋值都是1个字节为单位,因此初始化时,无符号类型的范围是0-2

ych9527的博客 1397

MOS管关断时尖峰电压的5种实用抑制方案(附实测数据对比)

本文针对MOS管关断时产生的尖峰电压问题,提供了五种经过实验室实测验证的实用抑制方案。文章从尖峰电压的成因分析入手,详细阐述了优化PCB布局、设计RC缓冲电路、选用TVS二极管钳位、调节驱动电路以及使用磁珠吸收高频振荡等方法的原理、实施步骤与实测数据对比,为硬件工程师解决开关电源和电机驱动中的过压应力与EMI问题提供了系统性的实战指南。

1239

利用mininet模拟SDN架构并进行DDoS攻击与防御模拟(Ryu+mininet+sflow+postman)

1、知识概述 (1)软件定义网络: (2)mininet: Mininet是一个强大的网络仿真平台,通过这个平台,我们可以很方便的模拟真实环境中的网络操作与架构。特别是SDN,在真实网络中进行相关的网络实验有一定难度,自然需要一个仿真平台可以学习这种新型的网络架构,而Mininet就应运而生,承担了这个光荣而艰巨的使命。Mininet自带交换机(switchs)、主机(hosts)、控制器(controllers),同时,在mininet上可以安装OpenvSwitch、多种控制器(NOX\POX

北风 1万+

memset用法

memset是以字节为单位就是对array指向的内存的4个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。所以用memset对非字符型数组赋初值是不可取的!当然,可以用memset(a,0,

qq_33035087的博客 260

【STABLE_BASELINE3】强化学习算法实战:模型的保存,读取,再训练

STABLE-BASELINE3,模型读取,再训练:有时候需要在已经训练好的模型基础上进行再次训练。

Kiek17的博客 4867

memset使用详解,你真的会按字节初始化吗?

正确使用memset函数进行初始化

qq_44906900的博客 463

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 552

R语言线性混合模型(LMM)分析

它将数据表示为固定效应和随机效应的线性组合,其中固定效应表示总体均值的影响,随机效应表示个体间的随机差异。LMM的目标是通过最大似然估计或最小二乘估计来估计模型中的固定效应和随机效应的参数。LMM结合了固定效应和随机效应,能够同时考虑个体间和个体内的变异,并适用于具有相关性的数据。目前在使用LMM的R语言包中,较常用的是lme4和nlme包,它们提供了丰富的函数和工具来拟合和分析线性混合模型。面板数据分析:LMM适用于分析具有面板结构的数据,如经济学中的面板数据或教育研究中的学生评估数据。

走向CTO的路上... 2968

C 语言内存函数的字节级操作:memcpy 与 memmove 的重叠边界、memset 填充和 memcmp 比较

C 语言内存函数的字节级操作:memcpy 与 memmove 的重叠边界、memset 填充和 memcmp 比较

2601_96348813的博客 155

SDMA 如何实现设备对主机内存的访问

摘要:SDMA(System Direct Memory Access)是PCIe设备直接访问主机内存的核心机制,使外设无需CPU干预即可高效读写系统RAM。其实现原理包括:设备作为主控发起DMA请求,通过PCIe Memory TLP访问主机物理地址;完整通路涉及驱动分配DMA安全内存、设备配置、地址转换(IOMMU)和中断通知等步骤;关键技术涵盖地址类型(HPA/IOVA)、TLP格式、缓存一致性和安全防护机制。SDMA广泛应用于GPU、网卡、NVMe等高性能场景,是现代异构计算的基础技术,需软硬件协同

MHD0815的博客 240

memset的赋值问题

因为这两个数组的二进制数无论多少位都是同一数字(全。按字节赋值,那对于要赋的值如果大于一个字节怎么办?的每个字节都会被设置为。

2301_78981471的博客 336

基于STM32、HAL库的WF282A气压传感器 驱动程序设计

测量范围:0-2.5MPa(可根据需求选择其他量程)输出方式:I2C或SPI数字接口。温度补偿范围:-20℃~85℃。低功耗设计,适合电池供电应用。工作电压:3.3V/5V。精度:±0.1%FS。

corlin6688的博客 394

【Unity引擎技术整合】 Unity学习路线 | 知识汇总 | 持续更新 | 保持乐趣 | 共同成长

本文对Unity引擎的知识进行了一个整理总结,基本包含了Unity中大部分的知识介绍。 网上也有很多Unity相关的学习资料,但大多数都不成体系,学起来的时候难免会东奔西走的摸不着头脑。 本文整理的多数文章都是有对应的系列性文章专栏,可以更方便的进行系统学习相关知识体系。

努力前行,总会成为自己心中的那道光 15万+

memset逐字节填充的特性

输出结果定义的MAXINT明明是三个3f的值(4144959),可是输出的确实4个3f的值,为什么?并且我将,MAXINT=0x3f3f3f改成MAXINT=0x3f,还是给我输出4个3f的值。

m0_73441691的博客 375

VC中sqlite的使用

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

fill和memset详解

fill:是 C++ 标准库中的算法函数,定义在头文件中。它通过迭代器指定一个范围,然后将该范围内的每个元素都设置为指定的值。memset:是 C 和 C++ 中的一个标准库函数,定义在(C++)或<string.h>(C)头文件中。它主要用于对一段内存空间进行字节级别的填充操作。

wykwasd75869的博客 793

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

fill函数与memset函数比较

【C++】fill函数,fill与memset函数的区别 1,memset函数 按照字节填充某字符 在头文件&amp;lt; cstring &amp;gt;里面 2,fill函数 按照单元赋值,将一个区间的元素都赋同一个值 在头文件&amp;lt; algorithm&amp;gt;里面 3,因为memset函数按照字节填充,所以一般memset只能用来填充char型数组,(因为只有char型占一个字节),也可以用来填充boo...

Stark_industry 1051

计算机控制技术及应用

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

memset的用法

参考资料: https://blog.youkuaiyun.com/yang_zongjun/article/details/39025581 有很多博客的确介绍了怎么具体操作。 但是我有些不理解它实际的计算,所以自己写一篇博客,以后人为鉴: 贴上代测代码: #include&amp;amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;amp;gt;us...

Reaearcher-Du 1万+

C++ fill和memset函数的区别

C++ fill和memset函数的区别 两者的定义 fill函数 fill(数组初始地址,数组末尾地址,字符) 将数组按块填充字符或数字 memset函数 memset(数组初始地址,字符,字节数) 按照字节赋值 两者的区别 fill函数可以赋任何值,vector容器也可以。 //数组赋值 int main () { int a[maxn]; fill(a,a...

TsuaNm的博客 402

C语言内存函数详解:memcpy、memmove、memset、memcmp避坑指南

内存操作是C语言底层开发的核心,memcpy、memmove、memset、memcmp等函数用于直接操作字节数据,支持二进制、结构体等任意类型。其原理基于字节级拷贝与比较,需注意内存重叠、填充陷阱和返回值符号。正确使用可提升代码安全性与性能,广泛应用于缓冲区管理、协议解析和嵌入式系统。本文深入剖析这四个函数的核心细节与常见错误,助你避开内存越界与数据错乱。

weixin_30536861的博客 307

【C语言】memset实战指南:从基础用法到高级技巧

本文全面解析C语言中memset函数的基础用法与高级技巧,涵盖数组清零、动态内存初始化、结构体内存擦除等实战场景,并深入探讨性能优化、安全考量和平台差异。通过实际案例和性能测试,帮助开发者避免常见陷阱,提升内存操作效率。

weixin_30772105的博客 484

memset函数

memset是高效的内存填充函数,按字节设置。最常用于清零内存(c=0),也可用于填充字符数组。对于非字符类型的初始化,一般仅当c=0时才安全(得到正确零值)。使用时注意长度参数,避免越界或意外结果。

2604_95587054的博客 287

【C 语言】内存函数全解析:memcpy、memmove、memset、memcmp 与模拟实现

把对象暂时看成连续字节区间,并由调用者对区间边界负责。memcpy适合确定不重叠的复制;memmove通过安全的复制顺序保证重叠场景正确;memset重复写入一个字节模式,不能代替任意类型的逐元素赋值;memcmp按逐字节比较,只能依赖返回值的正、零、负关系。对象是否存活且可访问↓起点与长度是否落在对象边界内↓源区间与目标区间是否重叠↓第三个参数是否真的是字节数↓对象表示是否适合当前操作↓是否按函数契约解释返回值。

星光编译者的技术博客,专注 C/C++、Linux、数据结构与算法。 608

C语言的内存函数

在arr1复制了3个数据后,原数组的4,5,6已经被覆盖成1,2,3。从数组开头开始,再往后数5个位置,在复制过来24个字节的数据,int的大小就是6个数字。比较就从第一个字节如果相等就向后比较,如果有大小区别就直接输出结果,大于就输出大于0的结果,小于就输出小于0的结果。从后向前复制就是,让两个部分从后向前移动,先让6去覆盖9的位置。memset的作用就是设置内存,从指定位置修改以字节为单位的大小的内容改成指定内容。当memcpy复制的内容有重叠的部分,会引起错误,错误的情况各有不同。

2401_83810772的博客 155
上一篇: 奇异递归模板(CRTP)
下一篇: 模板特例化
CodeDingHai
博客等级 码龄1年 47粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值