如何防止函数内意外修改数组数据?

斗罗大陆叙事体系与战斗系统设计解析 在文学创作与游戏设计中,世界观构建和战斗系统设计是两大核心技术要素。世界观作为故事发生的背景框架,需要融合东西方文化元素并建立量化标准,如《斗罗大陆》中武魂觉醒与魂环等级体系。战斗系统则需突破简单数值对抗,发展出武魂特性、魂技组合与环境互动的三维体系,其中魂导器技术的引入展现了科技与魔法的创新融合。这些设计原理在RPG游戏开发、网络文学创作等领域具有广泛应用价值,特别是对需要长期运营的IP作品,完善的系统设定能有效支撑剧情延展与商业化开发。本文以现象级作品为例,剖析其武魂拟态理论和魂师工业化构思如何成就经典 阅读详情

1. 使用const关键字保护数组(最常用且高效)

原理:在函数参数中将数组指针声明为const类型,编译器会阻止对数组内容的修改。

实现方式:

void printArray(const int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]); 
        // arr[i] = 10; // 编译错误:尝试修改const数据
    }
}

优点:

  • 编译时检查:任何修改尝试会触发编译错误125。
  • 明确意图:函数声明即表明“只读”操作,提高代码可读性。
  • 兼容性:可同时接受普通数组和const数组作为参数1。
  • 适用场景:只读操作(如打印、计算总和)。

2. 结构体封装数组(固定大小数组的替代方案)

  • 原理:将数组嵌入结构体,传递结构体副本而非指针,避免直接暴露内存地址。
  • 实现方式:
typedef struct {
    int data[10];
} ArrayWrapper;

void processArray(ArrayWrapper wrapper) {
    // 修改wrapper.data不会影响原数组(结构体是值传递)
}
  • 优点:
    • 数据隔离:函数内操作的是副本,原数组不受影响3。
    • 类型安全:保留数组大小信息(如sizeof(wrapper.data))。
  • 缺点:
    • 拷贝开销:大型数组可能导致性能下降3。
  • 适用场景:小型固定大小数组,且需避免指针传递的场景。

3,传递数组,操作数组副本:

void safeFunc(int arr[], int size) {
    int copy[size];
    memcpy(copy, arr, size * sizeof(int));
    // 操作copy数组,原数组不受影响
}

4 辅助防护策略

  • 编译器警告与静态分析:
    • 启用编译选项如-Wall -Wextra(GCC/Clang),捕获潜在越界或修改11。
    • 使用工具如Clang静态分析器或Cppcheck,提前发现逻辑错误。
  • 运行时边界检查:
void safeAccess(int *arr, int size, int index) {
    if (index >= 0 && index < size) {
        arr[index] = 42; // 安全修改
    } else {
        printf("越界访问!");
    }
}
    • 作用:防止越界写入污染其他内存。

4. 理解数组参数传递的本质

  • 底层机制:数组作为函数参数时,实际传递的是首元素地址(指针),而非整个数组的拷贝46。
  • 风险:函数内通过指针可直接修改原数组,且sizeof(arr)返回指针大小而非数组大小4。
  • 必须实践:
    • 若函数需修改数组,明确注释或命名(如modifyArray())。
    • 非修改函数强制使用const,避免误操作。

总结:如何选择?

方法

适用场景

关键优势

const关键字

大多数只读操作

编译时检查、零开销

结构体封装

固定大小的小型数组

数据隔离、类型安全

运行时边界检查

需动态修改数组的场景

防止越界破坏内存

Linkage Mapper 输出文件夹结构解析——LCPs(栅格廊道)、LinkagePaths(矢量廊道)、Nodes(节点) Linkage Mapper输出文件解析摘要 Linkage Mapper是生态连通性分析的重要工具,通过最小累积阻力模型(MCR)识别物种迁移廊道。其输出包含三类核心文件: LCPs(栅格廊道):存储累积阻力值的栅格数据,直观展示低阻力路径,适用于空间分析和廊道质量评估。 LinkagePaths(矢量廊道):以矢量线状要素精确记录廊道位置和走向,便于地图可视化及连通性分析。 Nodes(节点):标记廊道关键点(起点/终点/交汇点),为保护策略制定提供依据。 典型应用场景包括: 山地物种(如大熊猫)栖息地 阅读详情

相关推荐

Weaxor勒索病毒实战分析:从加密算法到防御策略(附检测工具清单)

本文对Weaxor勒索病毒进行了深度实战剖析,详细拆解了其采用ChaCha20与AES-CTR的混合加密算法、横向移动手法及数据回传行为。文章重点分析了其密钥生成机制的“漏洞修复”,并提供了从主机加固、网络监控到基于IOC威胁狩猎的立体化企业级防御策略与检测工具清单。

weixin_29233333的博客 263

数组的增强for循环不能改变数组的值

如图 我们先定义了一个数组 {1,2,3,4,5} 我们尝试用增强for循环遍历它然后期望把其中的值都修改为10 再看一下输出的结果 发现并没有改成功!!! 使用普通的for循环试一下: 查看一下输出结果: 发现普通for循环可以对原数组中的值赋值。 那么这是为什么呢? 原来增强for循环中的循环变量相当于一个临时变量,系统会把数组元素依次赋给这个临时变量,而这个临时变量并不是数组元素,它...

weixin_43244698的博客 3904

音视频开发—H264相关概念和压缩原理详解(GOP、宏块、帧内压缩、帧间压缩)

本文讲述了H264相关概念和原理——GOP概念,SPS与PPS,帧内压缩原理,帧间压缩原理,解释了什么是运动补偿,什么运动矢量等等概念

weixin_46999174的博客 3979

【C++的取经之路】(一)函数、数组与指针,引用与值传递

本文介绍了C++中易混淆的概念——函数、数组与指针,引用与值传递。

Larissa的博客 363

I2C通信协议SCL与SDA引脚特性:核心要点总结

深入讲解I2C通信协议中SCL和SDA引脚的工作机制与电气特性,帮助理解i2c通信协议的稳定传输原理,掌握上拉电阻配置与信号时序控制要点。

weixin_42103128的博客 2740

Windows升级保留个人文件和应用灰色?改注册表版本指纹

Windows 升级安装并非简单跳过下一步,安装程序会先读取注册表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的 EditionID、ProductName、CompositionEditionID 等版本指纹,与目标镜像 install.wim/esd 记录的版本类型做双向匹配。若当前系统被识别为 LTSC、精简版或跨版本降级,兼容性扫描会判定升级路径不可用,于是“保留个人文件和应用”变灰,只能全新安装。理解版本指纹与升级可行性表的匹配机制,可

weixin_31986143的博客 376

【const】const关键字

文章目录const修饰基本数据类型(int、double、float、char)const修饰数组const修饰指针变量const在函数传参中的作用const在函数返回值中的作用 const修饰基本数据类型(int、double、float、char) 被const修饰的变量为只读变量,不能修改,但可以在初始化时赋值。 #include <iostream> using namespa...

Eternally123的博客 271

Axure原型模板与元件库APP交互设计素材(附资料)

在Axure中,手机模型是展示APP或小程序界面效果的重要工具。通过导入手机模型元件,设计师可以更加直观地模拟真实设备的显示效果,从而更准确地评估设计的可行性和用户体验。Axure官方及第三方资源库中提供了多种品牌和型号的手机模型,如iPhone、Android等,设计师可以根据项目需求选择合适的模型进行使用。Axure作为一款强大的原型设计工具,为APP和小程序的设计与开发提供了丰富的界面组件元件库和交互设计素材。

招风的黑耳优快云 1981

十分钟学会const

秒懂const与指针 、const成员函数、const的优势

努力进大厂的小码娄 936

华为OD机试真题2025双机位C卷 Java&Go 实现【统计员工影响力分数】

华为OD机试真题2025双机位C卷 C语言 实现【统计员工影响力分数】假设你是大型科技公司的数据分析师,负责分析公司内部员工的社交网络。你需要编写一个函数来计算每个员工的影响力分数。影响力分数定义为该员工直接和间接影响的员工数量。 输入描述

MISAYAONE的博客 281

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

C++ Primer Plus学习笔记:第七章:函数——C++的编程模块

这个系列的文章不是针对C++的初学者写的,当然也不是针对大佬写的,而是写给那些曾经学过旧版的C++而且已经忘了很多东西或者是想知道部分内容的原理的同学,我会把我忘记和可能会忘记的知识点列出来,适当拓展,通过实验加深理解

LiuKairui的博客 1315

用业务语义织就企业数据之网:SAP Datasphere 的定位、架构与落地场景全解析

SAP Datasphere作为SAP业务数据云的核心组件,通过语义层整合企业内外部数据,支持实时分析与AI应用。其核心功能包括数据集成、语义建模、虚拟化与仓库能力,通过Spaces实现资源隔离,Data Builder和Business Builder分别面向技术和业务建模。该平台与SAP HANA Cloud、SAC等深度集成,支持财务统一分析、供应链可视化等典型场景,并可通过BW bridge实现传统BW资产云化迁移。Datasphere强调开放互联,能与Databricks等生态伙伴协同,为企业提供

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

const关键字,指针操作一维字符型数组(14)

const //只读//a 此时是一个只读的变量。

weixin_63345747的博客 388

深度学习工具包 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")

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

指针与const

1、将const用于指针有一些很微妙的地方,可以用三种不同的方式将const关键字用于指针。 方法一:让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值 首先,声明一个指向常量的指针pt: int age = 39; const int *pt = &age; 该声明指出,pt指向一个const int,因此不能使用pt来修改这个值。换句话说,*pt的值为const,...

子生的博客 346

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python中numpy数组的复制问题

记录一下之前没有遇到过的问题。 1、首先key是一个numpy数组,但是这个赋值给key_new之后改变key_new 同样也会改变key。相当于是他们两个变量指向了同一块地址,所有改变一个另一个就会变。 key Out[35]: array([[ 1, 2, 3, 4], [14, 6, 14, 14], [13, 2, 1, 9], [ 9, 12, 12, 6], [14, 4, 4, 10]]) key_new = k

qq_45978862的博客 2327

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

软件构造:防御式拷贝

我们看第二个函数会发现它的求和利用了第一个函数,它挨个把数组元素都替换成了绝对值,数组发生了变换。它是个可变数据类型,它被改变了,所以后面运行最后一行求和,求的不再是原来的数组,而是现在这个绝对值数组。再看主函数,乍一看似乎没什么问题。但如果仔细看主函数后两行的代码,或者运行一下,你会发现两个和是一样的。对有负数的数组来说也是如此,这肯定是出现了问题,但是哪里错了呢。修改两个方法,使得他们返回一个全新的对象,用户得到了一样的值,但这次他们不能再改变Period本身的属性了,因为他们改变的是全新的对象。

weixin_65952886的博客 279

【C++】第八章 结构体/数组/指针/函数参数

【C++】第八章:结构体/数组/指针/函数参数

MengYa_Dream的博客 1282

js深拷贝和浅拷贝对数组的影响_js 中数组或者对象的深拷贝和浅拷贝

浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变!深拷贝:就是重新复制一块内存,这样就不会互相影响。有些时候我们定义一个数组,把这个数据赋值给跟多对象数组中的一个字段,当我们改变对象数组中的该字段的时候,我们会把原来的数组也改变了,这样就会引起其他数组对象中的对应的字段改变,这不是我们想要的。这个时候我们会用到深拷贝。...

weixin_36464343的博客 140

C++语言日记 day5

这里定义的结构体Teacher里包括了一个结构体 Student* 类型的指针stu新建一个Student结构体类型 名为student[ ]的数组新建一个Teacher结构体类型 名为tec的变量,使这个结构体变量里的指针stu指向student数组变量通过输入的int型数字 i 可以访问到数组中的每个元素的属性。

qq_49259164的博客 111

【c++】结构体

【c++】结构体

FishC的博客 459

C++学习 结构体

定义:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。语法:struct 结构体名称结构体成员列表(struct 关键字不可省略)创建结构体实例的三种方式: 推荐使用第一种、第二种。我个人喜欢使用第一种① struct 结构体名 变量名;(struct 关键字可省略)。② struct 结构体名 变量名 = {成员值1,成员值2...}eg: struct Student s2 ={ "李四",20, 95};(struct 关键字可省略)。

清欢01的博客 338

前端深拷贝 全局应用

前端深拷贝 在main.js中引入即可。

qq_55995331的博客 141

const关键字

const的使用 1)const 修饰变量 变量定义的同时必须初始化,功能是对变量声明为只读特性,保护变量值以防被修改 const int i = 5; int const i = 5; i = 10; //不能修改i的值,错误 以上两种写法都是正确的,若想对i重新赋值,如i = 10,则是错误的 2)const 修饰数组 数组元素与变量相似,具有只读属性,不能被修改 const int array[5] = {1, 2, 3, 4, 5}; array[0] = 7; // 错误 3)co

徐佳佳的博客 133

C++结构体

结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构即是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义一样。

hjl011006的博客 763

【转载】const总结

这样做的结果是,每个包含了constant.h的*.c文件,都有一份该变量自己的copy,该变量实际上还是被定义了多次,占用了多个存储空间,不过在加了static关键字后,解决了文件间重定义的冲突。const 的好处,是引入了常量的概念,让我们不要去修改不该修改的内存。我们的第二条规则则是,尽可能多的使用const。他修饰的是一个数组,argv[],意思就是说这个数组的元素是只读的。如果加了const,那么对于这个函数的实现者,可以防止他在实现这个函数的时候修改不需要修改的值(len),这样很好。

erlaiwithwowang的博客 48
上一篇: 数组作为函数入参传递,在函数内修改数据,原数据是否会被修改?
下一篇: 字符数组可以初始化赋值,却不能直接赋值,为啥?
AI发烧友
博客等级 码龄4年 266粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值