-
2021-11-26 20:01:45
在C语言中,所有定义的变量最终都是加载到内存中进行相关的操作的,包括数组;数组在内存中占据的空间是连续的,而且数组的每个元素都是相同的数据类型。这就决定了我们在访问数组时必须能够找到这一连续内存空间的首地址,这个首地址自然就落到了数组名的肩上。此时,这个首地址就是第一个元素的地址;这样一来,当需要访问其他数据元素时都需要和这个首地址进行关联,数组的下标实际上表示的意义是:数组中元素位置与首地址的偏移量。因此在C语言中数组的第一个元素下标即为0。另一种理解方式可以和自然数做类比:最小的自然数是0而不是1——道理是一样的。
看到了很多人用各种方式来解释这个问题都很牵强,实际上如果对内存理解比较深入的话就不存在这个问题了。更多相关内容 -
C语言数组下标要从 0 开始而不可以从 1 开始,否则导致数组越界问题
2020-11-05 11:15:432,为什么数组要从 0 开始编号,而不是从 1 开始呢? https://blog.csdn.net/qq_44742154/article/details/105472777 3,C----数组越界问题、指针入门 https://blog.csdn.net/w1216702236/article/details/83120318...1,数组越界访问
https://blog.csdn.net/qq_41209741/article/details/80465496
2,为什么数组要从 0 开始编号,而不是从 1 开始呢?
https://blog.csdn.net/qq_44742154/article/details/105472777
3,C----数组越界问题、指针入门
https://blog.csdn.net/w1216702236/article/details/83120318
4,自身对C语言数组越界访问的简易理解
-
C语言 数组下标越界 - C语言零基础入门教程
2021-08-19 09:36:40数组下标越界简介 1、什么是数组访问越界? 2、访问越界会出现什么结果? 二.数组下标越界案例 三.防止数组下标越界方法 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一...目录
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
一.数组下标越界简介
1、什么是数组访问越界?
在
C
语言中,我们可以直接通过数组下标来访问数组中的元素;如果一个数组定义为有
n
个元素,那么,对这n
个元素(下标为0
到n-1
的元素)的访问都合法,如果对这n
个元素之外的访问,就是非法的,称为**越界**,例如:int a[5] = {0}; //等价 int a[5] = {0,0,0,0,0}; a[0] = 1; // ok a[1] = 2; // ok a[2] = 3; // ok a[3] = 4; // ok a[4] = 5; // ok a[5] = 6; // 数组下标越界
在上面代码中,声明一个数组
a[5]
,该数组中只能存放5
个元素,下标索引值取值范围0~4
,超过这个范围就属于下标越界;2、访问越界会出现什么结果?
首先,它并不会 造成编译错误!就是说,
C
,C++
的编译器并不判断和指出你的代码访问越界了。一个明明是错误的东西,就这样“顺利”地通过了编译;数组访问越界在运行时,它的表现是不定的,有时似乎什么事也没有,程序一直运行(当然,某些错误结果已造成);有时,则是程序一下子崩溃。因此在使用数组时,一定要在编程中判断是否越界以保证程序的正确性。
二.数组下标越界案例
/******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:C语言教程 - C语言 数组下标越界 //@Time:2021/06/10 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /******************************************************************************************/ #include <stdio.h> int main() { int i, a[10]; for(i = 1; i <= 10; ++i) a[i] = 0; return 0; }
数组中的下标从 0 开始,那么在上面代码中只能访问:
a[1]
、a[2]
、a[3]
、a[4]
、a[5]
、a[6]
、a[7]
、a[8]
、a[9]
;当i
自加到10
时,a[10]
属于数组下标越界。三.防止数组下标越界方法
如果数组的长度和下标访问值弄错,都会造成数组下标越界;数组的下标是从 0 开始的,最大的访问值是数组的长度-1;
//如果是整形数组 int len = sizeof(array)/sizeof(int); //如果是字符数组 int len = sizeof(array)/sizeof(char); //如果是浮点数数组 int len = sizeof(array)/sizeof(double); //如果是浮点数数组 int len = sizeof(array)/sizeof(float); for(int i = 0;i < len ; i++) { //..... }
四.猜你喜欢
- 安装 Visual Studio
- 安装 Visual Studio 插件 Visual Assist
- Visual Studio 2008 卸载
- Visual Studio 2003/2015 卸载
- C 语言格式控制符/占位符
- C 语言逻辑运算符
- C 语言三目运算符
- C 语言逗号表达式
- C 语言 sizeof 和 strlen 函数区别
- C 语言 strcpy 和 strcpy_s 函数区别
- C 语言 memcpy 和 memcpy_s 区别
- C 语言 数组定义和使用
- C 语言 数组遍历
- C 语言 数组排序 – 冒泡法排序
- C 语言 数组排序 – 选择法排序
- C 语言 数组排序 – 插入法排序
- C 语言 数组排序 – 快速法排序
- C 语言 数组下标越界
未经允许不得转载:猿说编程 » C 语言 数组下标越界
-
C语言数组下标越界
2021-08-31 23:46:59数组里的下标从0开始。 那么在上面代码只能访问:a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9] i自加到10时,a[10]属于数组下标越界。 详细分析图 1、栈把内存分配给数组,并且自上而下从小地址开数组越界的严重性
在 C 语言里,数组需为静态的。数组的大小需要在程序运行前就确定下来。
C语言数组越界的严重性在于对数组元素访问及修改的内容存在不确定性。
这类没有预知性的修改会导致无法确定的错误,发生缓冲区泄露漏洞。
这也就是数组越界的严重所在。代码如下所示:
数组里的下标从0开始。
那么在上面代码只能访问:a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]
i自加到10时,a[10]属于数组下标越界。详细分析图
1、栈把内存分配给数组,并且自上而下从小地址开始分配内存,对应于数组下标:
对数组进行内存分配之后进行数组循环赋值。数组下标为0~9在数组所分配的空间内。
由顶部代码可知数组访问将会越界,如图所示访问到数组范围之后,并且对越界空间进行操作,破坏原有数据。访问之后程序会破坏内存原有数据,导致缓冲区泄露,并且发生不可预知的错误。 -
C语言数组元素下标为何从0开始
2021-05-22 14:32:04很多同学可能在学习数组时会有这个疑问,下标为什么不从1开始呢?从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个。的确,有些计算机语言如早期的Pascal语言,数组元素的下标是从1开始的。... -
c语言中数组的下标从什么开始?
2021-05-20 06:26:58c语言中数组的下标从0开始。数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如:a[0]就表示名字为a的数组中的第... -
c语言数组下标为负数
2020-07-30 09:22:18c语言中数组的下标可以是负号,在代码运行前不会对数组是否下标越界、溢出等异常进行警告或处理,因此需人为干预。 测试代码: #include<stdio.h> #include <stdlib.h> int main(int argc, char *... -
C语言 数组下标越界和内存溢出区别 - C语言零基础入门教程
2021-08-20 09:38:23数组下标越界和内存溢出简介 二.数组下标越界和内存溢出区别 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.数组下标越界和内存溢出简介 **溢出本义是算术... -
C语言数组下标-1你见过吗?
2020-05-16 18:21:40不知道你有没有见过-1作为数组下标的,我算是见到了。当然这一点在Python之类的语言中毫不稀奇。 下标-1的代码 这里redis源码中的一部分: sdssdsMakeRoomFor(sdss,size_taddlen){ void*sh,*newsh; size_... -
C语言数组下标是负数-阿里云开发者社区
2020-12-23 04:32:08编程时我们经常会遇到处理边界问题的情况...C语言中数组下标必须是从0开始的,但C语言中的指针操作给我们提供了解决负数下标问题的方法。看下面一个示例:#include "stdafx.h"#include int main(int argc, char *arg... -
c语言数组的最大值及下标(数组)_如何输出数组的下标
2020-08-24 13:37:190821-数组的最大值及下标数组 时间限制: 1000 毫秒 内存限制: 32768 K字节 总提次数: 1145 次版权文档请勿用做商业用途 成功提交次数: 875 次版权文档请勿用做商业用途 判题规则: 严格比较 问题描述 在一个n1)个元素... -
C语言数组下标可以为负数
2020-12-19 14:20:51C语言数组下标可以为负数 个人觉得[]被实现为*(array+i)的话那自然要和i为负数的时候统一. 并且似乎将指针索引隐式转换成正数并不能带来什么好处, 访问一个很大的索引未必比访问一个绝对值小的负数来的更加安全(虽然... -
790-C语言的数组元素下标为何从0开始?
2021-11-09 20:38:03C语言的数组元素下标为何从0开始? 我们在学习数组时会有这个疑问,数组元素的下标为什么不从1开始呢? 从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个。 的确,有些计算机语言如早期的... -
为什么C数组下标从0开始,而不是从1开始
2018-07-30 14:22:45对于学习过编程语言的人来说,相信绝大多数人都会有这样的疑问:我们平时计数,通常是从一开始计数的,为什么在编程语言中,数组的下标是从0开始计算的呢? 这是因为,C语言中,下标的含意是:当前元素到第一个... -
C语言之数组下标引用与间接引用
2021-05-23 01:26:16数组元素的访问方式有下标引用和间接访问两种.除了优先级之外, 下标引用和间接访问完全相同. arrayname[subscript] = *(arrayname + (subscript))例如:int arrayname[10];int *arrayptr = arrayname + 2;arrayptr = ... -
C语言数组入门之数组的声明与二维数组的模拟
2020-12-31 10:13:35对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组... -
C语言数组下标越界问题引发的思考:
2018-06-23 15:49:47C 语言中的内存分配机制暂不了解!GCC --version6.3.0-18+deb9u1 20170516代码#include<stdio.h> int main{ int a[3]={1,2,3}; int i;...a[0],&a[1],&a[2],&... -
c语言中数组的下标从什么入手下手?_后端开发
2021-05-22 06:30:10c言语中数组的下标从0入手下手。由于假如数组元素下标从1入手下手,每次盘算地点时,须要多做一次减法操纵。所以,为了进步效力,C言语数组元素下标从0入手下手。 c言语中数组的下标从0入手下手。数组中的各元素的... -
c语言中如何防止数组下标越界
2022-06-05 00:12:38数组下标从0开始,访问值为-1。2、在使用循环遍历数组元素时,注意防范off-by-one的错误。对于作为函数参数传入的数组下标,要判断其合法性。实例//如果是整形数组 int len = sizeof(array)/sizeof(int); //如果是... -
c语言数组下标访问的原理
2019-04-10 13:59:38//数组下标访问的原理 //[n]偏移n个数然后间接引用,n放偏移量的数,不偏移则写0,然后间接引用 #include<stdio.h> int main() { int arr[5]={1,2,3,4,5}; int i=0; //不加*的情况下遍历数组 for (i=0;i&... -
在c语言中引用数组元素时,其数组下标的数据类型允许是什么
2021-05-19 09:36:14在c语言中引用数组元素时,其数组下标的数据类型允许是:整型常量或整型表达式。C语言规定只能逐个引用数组元素而不能一次引用整个数组,数据元素的表示形式为“数组名[下标]”,下标可以是整型常量或整型表达式。本... -
c语言求数组中心下标
2021-12-08 21:17:28如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。 如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,... -
C语言数组赋值一例
2020-07-16 16:18:22从这里学习到一个数组的赋值的方法,即实际赋值可以按不同的顺序(只要是合法的下标),而不是仅限于从0~N这样的顺序去赋值。 -
c语言中数组下标的加减,平移总结
2020-09-19 19:22:16数组下标是从0开始编号的; 当前数组下标就是该元素之前元素的个数。 无论是从从0开始下标,还是从1开始下标,两下标之差是一样的,都表示b比a多了几个元素。 前言: 加法的理解: a+2= b 表示b比a多2; 减法的理解:... -
第六章 C语言数组_什么是数组?C语言数组的基本概念
2022-02-20 15:09:10C语言数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 数组... -
c语言中数组下标加减、移位的分析
2020-02-13 15:46:52数组下标加了某值后,此时下标是多少? 情况是否都包含完整? 例如: for(int i=temp->length-1; i>=n-1;i--)//转化为数组的下标,最后一个下标和第n个下标 { temp->list[i+1]= temp->list[i]; } ... -
为什么编程语言中数组的下标总是从0开始?
2021-05-22 13:12:39像目前主流的编程语言C/C++,Java,JavaScript的数组下标都是以0开始,最后一个位置的index=数组的长度-1,当然也有少数的编程语言如Fortran,声明一个a(10)默认就是从1开始的,当然你可以指定从0...