当前位置: 首页 > news >正文

C语言数据相关知识:静态数据、越界与溢出

1、静态数组

在 C 语言中,数组一旦被定义后,占用的内存空间就是固定的,容量就是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态数组。

反过来说,如果数组在定义后可以改变容量,允许在任意位置插入或者删除元素,那么这样的数组称为动态数组。

总之,C 语言中的数组是静态的,一旦定义后长度就不能改变了,大家要注意这一点,不要尝试去插入或删除元素

1.#include <stdio.h>
2.
3. //自定义函数,用来输出数组元素
4. void display_array(int arr[], int len){
5. int i;
6. for(i=0; i<len; i++){
7. printf("%d ", arr[i]);
8. }
9. printf("\\n");
10. }
11.
12. int main()
13. {
14. int nums[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
15. int nums_new1[9];
16. int nums_new2[11];
17. int i;
18. 
19. //删除 nums 第 6 个元素
20. for(i=0; i<10; i++){
21. //i 等于 6 时直接跳过,不进行任何操作
22. if(i < 6){
23. nums_new1[i] = nums[i];
24. }else if(i > 6){
25. nums_new1[i-1] = nums[i];
26. }
27. }
28. display_array(nums_new1, 9);
29. 
30. //在 nums 第 6 个元素后面插入一个整数 55
31. for(i=0; i<10; i++){
32. if(i < 7){
33. nums_new2[i] = nums[i];
34. }else if(i > 7){
35. nums_new2[i+1] = nums[i];
36. }else { //i 等于 7
37. nums_new2[i] = 55;
38. nums_new2[i+1] = nums[i];
39. }
40. }
41. display_array(nums_new2, 11);
42. 
43. return 0;
44. }

C 语言数组为什么是静态的

不能插入和删除数组元素有时候会非常麻烦,比如一个数组保存了某个班级的学生学号,现在有一名学生退学了,就得把 TA 从数组中剔除,但是 C 语言并不支持这么做,这就给编程带来了不小的麻烦。

数组元素都是紧挨着排布的,中间没有空隙,不管是插入元素还是删除元素,都得移动该元素后面的内存:

在第 i 个元素后面插入一个新元素时,第 i 个元素后面的所有元素都要往后移动一个元素的位置,从而给新元素腾出位置来。如果该数组后面紧跟的是其它有用数据,那么为了防止覆盖有用数据,还不敢直接往后移动元素,必须得重新开辟一块内存,把所有的元素都复制过去。

删除第 i 个元素就比较简单了,不管三七二十一,把第 i 个元素后面的所有元素都向前移动即可。

 2、越界与溢出

数组越界:

C 语言数组是静态的,不能自动扩容,当下标小于零或大于等于数组长度时,就发生了越界(Out OfBounds),访问到数组以外的内存。如果下标小于零,就会发生下限越界(Off Normal Lower);如果下标大于等于数组长度,就会发生上限越界(Off Normal Upper)。

C 语言为了提高效率,保证操作的灵活性,并不会对越界行为进行检查,即使越界了,也能够正常编译,只有在运行期间才可能会发生问题。请看下面的代码:

1.#include <stdio.h>
2. int main()
3. {
4. int a[3] = {10, 20, 30}, i;
5. for(i=-2; i<=4; i++){
6. printf("a[%d]=%d\\n", i, a[i]);
7. }
8.
9. return 0;
10. }

越界访问的数组元素的值都是不确定的,没有实际的含义,因为数组之外的内存我们并不知道是什么,可能是其它变量的值,可能是函数参数,可能是一个地址,这些都是不可控的。

由于 C 语言的”放任“,我们访问数组时必须非常小心,要确保不会发生越界。每个 C 语言程序员的生涯中都遇到过越界错误,我拿项上人头作保证,所以千万不要大意,因为越界错误有时候不容易发现,也不容易复现。

当发生数组越界时,如果我们对该内存有使用权限,那么程序将正常运行,但会出现不可控的结果(如上例所示);如果我们对该内存没有使用权限,或者该内存压根就没有被分配,那么程序将会崩溃。请看下面的例子:

每个程序能使用的内存都是有限的,该程序要访问 4*10000 字节处的内存,显然太远了,超出了程序的访问范围。这个地方的内存可能没有被分配,可能是系统本身占用的内存,可能是其它数据的内存,如果放任这种行为,将带来非常危险的后果,操作系统只能让程序停止运行。

数组溢出:

当赋予数组的元素个数超过数组长度时,就会发生溢出(Overflow)。如下所示:

int a[3] = {1, 2, 3, 4, 5};

数组长度为 3,初始化时却赋予 5 个元素,超出了数组容量,所以只能保存前 3 个元素,后面的元素被丢弃。GCC、LLVM/Clang、低版本的 VS(例如 VS2010)发现数组溢出只会给出警告,并不会报错。但是高版本的VS(例如 VS2015、VS2017)发现数组溢出时会报错,禁止编译通过,微软终于聪明了一次。一般情况下数组溢出不会有什么问题,顶多是丢失多余的元素。但是当以字符串的形式输出字符数组时,就会产生不可控的情况

字符串的长度大于数组长度,数组只能容纳字符串的前面一部分,即使编译器在最后添加了'\0',它也保存不到数组里面,所以 printf() 扫描数组时不会遇到结束符'\0',只能继续向后扫描。而后面内存中的数据我们不知道是什么,字符能否识别,何时遇到'\0',这些都是不确定的。当字符无法识别时,就会出现乱码,显示奇怪的字符。

由此可见,在用字符串给字符数组赋值时,要保证数组长度大于字符串长度,以容纳结束符'\0'。

相关文章:

C语言数据相关知识:静态数据、越界与溢出

1、静态数组 在 C 语言中&#xff0c;数组一旦被定义后&#xff0c;占用的内存空间就是固定的&#xff0c;容量就是不可改变的&#xff0c;既不能在任何位置插入元素&#xff0c;也不能在任何位置删除元素&#xff0c;只能读取和修改元素&#xff0c;我们将这样的数组称为静态…...

文本分析之余弦相似度

余弦相似度(Cosine Similarity)是一种用于衡量两个非零向量之间相似度的指标,尤其常用于文本分析和自然语言处理领域。其核心思想是通过计算两个向量的夹角余弦值来评估它们的相似性。具体而言,余弦相似度的值范围从-1到1,其中1表示两个向量完全相同,0表示它们之间没有相…...

【VUE3】【Naive UI】<n-button> 标签

【VUE3】【Naive UI】&#xff1c;n-button&#xff1e; 标签 **type**- 定义按钮的类型&#xff0c;这会影响按钮的颜色和样式。**size**- 设置按钮的大小。**disabled**- 布尔值&#xff0c;控制按钮是否处于禁用状态。**loading**- 布尔值&#xff0c;表示按钮是否处于加载状…...

css使盒子在屏幕的地点固定

在 CSS 中&#xff0c;要将一个元素固定在页面的某个位置&#xff0c;可以使用 position: fixed 属性。以下是详细的代码示例和中文解释&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta n…...

Transformers快速入门代码解析(六):注意力机制——Transformer Encoder:执行顺序解析

Transformer Encoder&#xff1a;执行顺序解析 引言执行顺序解析1. 设置模型检查点和分词器2. 输入预处理操作说明&#xff1a; 3. 加载模型配置configconfig 包含的主要参数常见配置&#xff08;BERT-base&#xff09; 4. 初始化 TransformerEncoder5. Transformer Encoder 的…...

图像小波去噪与总变分去噪详解与Python实现

目录 图像小波去噪与总变分去噪详解与实现1. 基础概念1.1 噪声类型及去噪问题定义1.2 小波去噪算法基础1.3 总变分去噪算法基础2. 小波去噪算法2.1 理论介绍2.2 Python实现及代码详解2.3 案例分析3. 总变分去噪算法3.1 理论介绍3.2 Python实现及代码详解3.3 案例分析4. 两种算法…...

【深度学习基础】预备知识 | 微积分

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

CTF-PWN glibc源码阅读[1]: 寻找libc中堆结构的定义(2.31-0ubuntu9.16)

源代码在这里下载 来到malloc/malloc.c 在980行发现这段代码 // 定义最大 mmap 值为 -4 #define M_MMAP_MAX -4// 如果没有定义 DEFAULT_MMAP_MAX&#xff0c;则将其定义为 65536 #ifndef DEFAULT_MMAP_MAX #define DEFAULT_MMAP_MAX (65536) #endif// 引…...

宏集eXware物联网网关在水务管理系统上的应用

一、前言 水务管理系统涵盖了对城市水网、供水、排水、污水处理等多个环节的监控与管理。随着物联网&#xff08;IoT&#xff09;技术的快速发展&#xff0c;物联网网关逐渐成为水务管理系统中的关键组成部分。 宏集物联网网关以其高效的数据采集、传输和管理功能&#xff0c…...

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数

1. UDF函数&#xff08;用户自定义函数&#xff09; 一般指的是用户自己定义的单行函数。一进一出&#xff0c;函数接受的是一行中的一个或者多个字段值&#xff0c;返回一个值。比如MySQL中的&#xff0c;日期相关的dateDiff函数&#xff0c;字符串相关的substring函数。 先…...

#Java-JDK7、8的时间相关类,包装类

1. JDK7-Date类 我们先来看时间的相关知识点 世界标准时间: 格林尼治时间/格林威治时间(Greenwich Mean Time)简称GMT。目前世界标准时间(UTC)已经替换为:原子钟中国标准时间: 世界标准时间8小时 时间单位换算: 1秒1000毫秒 1毫秒1000微秒 1微秒1000纳秒 Date类 Date类…...

tc 命令

Windows Network Shaper目前只能在win10及以下版本使用&#xff0c;在github上有源码。 iperf 是一个网络性能测试工具&#xff0c;可以测试网络带宽和延迟。 webrtc M96版本的GCC sudo tc qdisc del dev eth1 root //关闭限速 sudo tc qdisc add dev eth1 root handle 1: ht…...

基于Java Springboot 协同过滤算法音乐推荐系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue2、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#x…...

MyBatis框架-关联映射

MyBatis关联映射-一对一 1.1 实体关系 实体–数据实体&#xff0c;实体关系指的就是数据与数据之间的关系 例如&#xff1a;订单和商品&#xff0c;用户和角色 实体关系分为以下四种&#xff1a; **一对一关联&#xff1a;**用户表和用户详情表 数据表关系&#xff1a; 主键关…...

Web开发技术栈选择指南

互联网时代的蓬勃发展&#xff0c;让越来越多人投身软件开发领域。面对前端和后端的选择&#xff0c;很多初学者往往陷入迷茫。让我们一起深入了解这两个领域的特点&#xff0c;帮助你做出最适合自己的选择。 在互联网发展的早期&#xff0c;前端开发主要负责页面布局和简单的…...

工具类的魔力:深入理解 Java 的 String、Math 和 Arrays

Java 提供了许多实用的工具类&#xff0c;帮助开发者简化代码&#xff0c;提升效率。这些工具类包含了各种常见的操作&#xff0c;比如字符串处理、数学计算、数组操作等。掌握这些工具类的高效使用方法&#xff0c;不仅能让你写出更简洁、优雅的代码&#xff0c;还能在性能上有…...

Linux下一次性关闭多个同名进程

要一次性关闭多个同名的 Python 进程&#xff0c;例如&#xff1a; 你可以使用以下几种方法。在执行这些操作之前&#xff0c;请务必确认这些进程确实是你希望终止的&#xff0c;以避免意外关闭其他重要的进程。 方法一&#xff1a;使用 pkill 命令 pkill 是一个用于根据名称…...

记录一些虚拟机桥接网络,windows网络遇到的小问题

1 virtual box 桥接的虚拟系统无 ipv4 地址 https://blog.csdn.net/qq_44847649/article/details/122582954 原因是 wlan 无线网卡没开共享给 virtual box host only (之前用过 vmware 也类似) 2 无法两台 windows10 物理机无法相互 ping 通 https://blog.csdn.net/qq_35…...

MATLAB —— 机械臂工作空间,可达性分析

系列文章目录 前言 本示例展示了如何使用可操作性指数对不同类型的机械手进行工作空间分析。工作空间分析是一种有用的工具,可用于确定机器人工作空间中最容易改变末端效应器位置和方向的区域。本示例的重点是利用不同的可操控性指数类型来分析各种机械手的工作空间。了解工作…...

18:(标准库)DMA二:DMA+串口收发数据

DMA串口收发数据 1、DMA串口发送数据2、DMA中断串口接收定长数据包3、串口空闲中断DMA接收不定长数据包4、串口空闲中断DMA接收不定长数据包DMA发送数据包 1、DMA串口发送数据 当串口的波特率大于115200时&#xff0c;可以通过DMA1进行数据搬运&#xff0c;以防止数据的丢失。如…...

基因分析小白必看:5分钟学会用Plink计算连锁不平衡(附R绘图代码)

基因分析入门&#xff1a;用Plink和R实现连锁不平衡分析与可视化 在基因组学研究中&#xff0c;理解单核苷酸多态性(SNP)之间的连锁不平衡(LD)关系至关重要。LD分析能帮助我们识别基因组中共同遗传的区域&#xff0c;为疾病关联研究和群体遗传学分析提供关键见解。对于刚接触生…...

避坑指南:第一次做软件交付如何准备文档?这7个文件缺一不可

软件交付文档全攻略&#xff1a;从零搭建专业交付体系 第一次负责软件交付就像新手司机第一次上高速——既兴奋又忐忑。兴奋的是项目终于到了交付阶段&#xff0c;忐忑的是不知道前方会有什么"坑"等着你。而文档&#xff0c;就是你的导航系统&#xff0c;缺了它&…...

第2期:DIY键盘进阶:APM32固件定制与RGB灯效实战

1. APM32主控固件定制入门 第一次接触APM32主控固件开发时&#xff0c;我完全被那些专业术语吓到了。什么Bootloader、编译环境、烧录工具&#xff0c;听起来就像天书一样。但实际动手后发现&#xff0c;只要掌握几个关键步骤&#xff0c;整个过程比想象中简单得多。 首先需要准…...

人工智能如何改变 Anthropic 的工作方式15

如果有一天&#xff0c;你走进公司&#xff0c;发现写代码、查 bug、跑实验的大部分体力活&#xff0c;都已经由一位看不见的 AI 搭档在后台悄悄完成了——而你更多是在提问题、定方向、做决策&#xff0c;而不是一行行敲代码&#xff0c;这会是什么感觉&#xff1f;是兴奋&…...

大模型开发手记(十三):langchain skills(下):构建skills架构agent实战

目录前言一、整体架构预览二、实战2.1 第一步&#xff1a;定义Skill文件酒店预订Skill景点推荐Skill2.2 第二步&#xff1a;编写Skill加载工具2.3 第三步&#xff1a;构建Skill中间件2.4 第四步&#xff1a;创建agent.py&#xff1a;第四步&#xff1a;运行与验证三、扩展思路前…...

Matlab遗传优化算法求解生鲜配送问题的路径优化与时间窗管理:考虑新鲜度与货损成本的解决方案...

Matlab遗传优化算法等算法 求解 生鲜配送问题 路径优化 时间窗 新鲜度 货损成本 等约束 程序算法参考文献半夜盯着冷库监控屏的时候&#xff0c;突然想到生鲜配送这活儿真是比炒菜还讲究火候。既要卡着菜市场凌晨三点半的到货时间&#xff0c;又要保证超市货架上的绿叶菜在早…...

Java中的并发工具类与ConcurrentHashMap

ConcurrentHashMap 不能用 put 替代 computeIfAbsent&#xff0c;因 put 初始化的原子性不能保证&#xff0c;但原子性不能保证 computeIfAbsent 通过 RESERVED 状态、CAS 并保证分段锁 key 对应 value 只创建一次。ConcurrentHashMap 为什么不能直接使用&#xff1f; put 替代…...

模块化MMC多点平逆变器控制技术:基于Matlab Simulink 2018a及以上版本的仿真研究

模块化MMC多点平逆变器控制 Matlab/simulink仿真(2018a及以上版本)&#xff0c;打开Simulink新建空白模型时&#xff0c;手滑打翻了手边的冰美式——这大概就是我和MMC拓扑的初见。模块化多电平换流器&#xff08;MMC&#xff09;这玩意儿最大的魅力&#xff0c;在于它像乐高积…...

RTL8211E千兆PHY芯片PCB设计避坑指南:从电源分层到差分线等长

RTL8211E千兆PHY芯片PCB设计实战&#xff1a;规避高频信号陷阱的12个关键策略 在千兆以太网硬件设计中&#xff0c;RTL8211E作为主流PHY芯片方案&#xff0c;其PCB实现质量直接影响网络传输的稳定性和速率上限。许多工程师在完成原理图设计后&#xff0c;往往在PCB阶段遭遇信号…...

vue+python甜点蛋糕商城系统 团子烘焙销售服务系统

目录系统架构设计前端功能模块后端功能实现部署与优化测试与维护项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统架构设计 采用前后端分离架构&#xff0c;前端使用Vue.js框架构建用户界面&#xff0c;后端使用Python的Dja…...