当前位置: 首页 > 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;以防止数据的丢失。如…...

【C++】 算术操作符与数据类型溢出详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;C 算术操作符详解基本算术操作符整数除法与取模行为类型转换在算术运算中的作用自增与自减操作符 &#x1f4af;数值溢出&#xff1a;当值超出类型范围时数据类型的取值范围…...

柔性芯片:实现万物互联的催化剂

物联网 (IoT) 市场已经非常成熟&#xff0c;麦肯锡预测&#xff0c;物联网将再创高峰&#xff0c;到 2030 年将达到 12.5 万亿美元的估值。然而&#xff0c;万物互联 (IoE) 的愿景尚未实现&#xff0c;即由数十亿台智能互联设备组成&#xff0c;提供大规模洞察和效率。 究竟是…...

FFmpeg 简介与编译

1. ffmpeg 简介&#xff1a; FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移…...

低代码与微服务融合在医疗集团中的补充应用探究

摘要 本论文深入探讨了低代码与微服务融合在医疗系统集群中的应用。分析了其优势&#xff0c;包括提高开发效率、降低技术门槛、灵活适应需求变化和易于维护扩展等&#xff1b;阐述了面临的挑战&#xff0c;如数据安全与隐私保护、技术应用复杂性等&#xff1b;并展望了其在医…...

速盾:高防cdn的搜索引擎回源是什么?

高防CDN&#xff08;Content Delivery Network&#xff09;是一种用于加速网站访问速度和增加安全性的服务&#xff0c;它通过将静态和动态内容缓存在全球分布的服务器上&#xff0c;从而将用户请求的响应时间降至最低&#xff0c;并提供有效的防御攻击的能力。在实际使用过程中…...

减少电路和配电系统谐波的五种方法

K 级变压器 ANSI 标准 C57.110-1986 定义了 K 系数来评估电路消耗多少谐波电流并确定该谐波电流的热效应。根据电路 K 系数&#xff0c;变压器按 K 等级制造。值得注意的是&#xff0c;K 级变压器不会减少谐波。K 等级表示变压器承受谐波有害影响的相对能力。K级变压器增加了铁…...

基于Java Springboot Vue3图书管理系统

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

vue-cli项目质量约束配置

同步发布于我的网站 &#x1f680; package.json scriptslint-stageddevDependencies git-hooksno-eslintdevDependencies - scssdevDependencies - lessengines pre-commit.eslintrc.js.stylelintrc scssless vue.config.jsREADME.md package.json scripts "scripts&…...

第七课 Unity编辑器创建的资源优化_UI篇(UGUI)

上期我们学习了简单的Scene优化&#xff0c;接下来我们继续编辑器创建资源的UGUI优化 UI篇&#xff08;UGUI&#xff09; 优化UGUI应从哪些方面入手&#xff1f; 可以从CPU和GPU两方面考虑&#xff0c;CPU方面&#xff0c;避免触发或减少Canvas的Rebuild和Rebatch&#xff0c…...

【docker】docker build上下文

什么是 Docker Build 上下文&#xff1f; 在 Docker 中&#xff0c;构建上下文&#xff08;Build Context&#xff09; 是指在执行 docker build 命令时&#xff0c;Docker 会发送给 Docker 引擎的所有文件和目录的集合。构建上下文包含了 Dockerfile 和用于构建镜像的所有文件…...

电商网站设计思想/无锡网站建设方案优化

为什么我打印出对象的结果是&#xff1a;com.slef.model.User68999068&#xff0c;结果完全对应不上啊 原因&#xff1a;没有重写对象的toString()方法 System.out.println(user); println方法中&#xff1a; public void println(Object x) {String s String.valueOf(x);s…...

扬州 网站 建设/培训网络营销机构

“富友软件软件&#xff1f;没听过&#xff0c;做什么的&#xff1f;” “富友软件软件&#xff1f;当然知道了&#xff0c;我们这行很多家都选他们的软件。”  两种截然不同的回答&#xff0c;在一定程度上也反映了这家软件厂商的定位&#xff1a;专注服装行业&#xff0c;…...

怎样在领英上做公司网站/免费外链网

HTML介绍 HTML&#xff08;HyperText MarkupLanguage&#xff09;简称超文本标记语言。它和CSS、JavaScript组合完成一个网页的设计。对于一个网页&#xff0c;HTML定义网页的结构&#xff0c;CSS描述网页的样子&#xff0c;JavaScript则实现人机交互。 HTML语义化 说起HTML&am…...

普通网站建设是什么/惠州疫情最新情况

/* 输入一堆数&#xff0c;如果是两个数并且个数相同就输出yes和这两个数 否则输出no */ #include <bits/stdc.h> using namespace std; const int maxn 1010; int num[maxn] {0}; int a[maxn] {0}; const int inf 0x3f3f3f3f; int main() {int n;int sum 0;int flag…...

wordpress如何设置301/武汉企业seo推广

模板介绍 精美PPT模板设计&#xff0c;淡雅个人简历自我介绍PPT模板。一套个人简历幻灯片模板&#xff0c;内含蓝色多种配色&#xff0c;精美风格设计&#xff0c;动态播放效果&#xff0c;精美实用。 一份设计精美的PPT模板&#xff0c;可以让你在汇报演讲时脱颖而出。 希望…...

宁夏网站建设优化/百度网盘官网下载

在这篇 Linux 黑话解释中&#xff0c;你将了解 Linux 中的显示管理器。它是桌面环境的一部分吗&#xff1f;它的作用是什么&#xff1f;什么是 Linux 中的显示管理器&#xff1f;简单来说&#xff0c;显示管理器display manager(DM)是一个为你的 Linux 发行版提供图形登录功能的…...