【C语言】数组越界

目录

  • [1. 越界](#1. 越界)
    • [1.1 静态数组越界](#1.1 静态数组越界)
    • [1.2 动态数组越界](#1.2 动态数组越界)

1. 越界

1.1 静态数组越界

在C语言中,我们可以直接通过数组索引 来访问数组中的元素。如果一个数组有 n 个元素,对这 n 个元素(索引从 0n-1 的元素)的访问都合法,如果对这 n 个元素之外的访问,就是非法的,称为越界(access out of range),例如:

c 复制代码
#include <stdio.h>

#define SIZE 5

int main(int argc, char *argv[]) {
	int array[SIZE] = {0};
	unsigned index = 0;

	for (index = 0; index <= SIZE; index++) {
		printf("[%u] = %d\n",
				index, array[index]);
	}
	
	return 0;
}
/* The end of source file that named 'main.c' */

输出:

bash 复制代码
[0] = 0
[1] = 0
[2] = 0
[3] = 0
[4] = 0
[5] = 32766	#error overflow

有上面的输出就说明它并不会造成编译错误! 因为C语言的编译器并不会判断你的代码访问越界 了。错误就这样通过编译 了。

数组访问出现越界,结果是不可预测(可能导致程序崩溃、安全漏洞或其他不可预测的行为)。有时什么事也没有,程序一直运行(某些错误可能已经存在);有时则是程序崩溃。因此,在使用数组 时一定要判断是否越界以保证程序的正确性。

1.2 动态数组越界

c 复制代码
#include <stdio.h>
#include <stdlib.h>

#define SIZE 5

typedef struct coordinate {
    int x;
    int y;
} Coordinate;

int main(int argc, char *argv[]) {
    /*
     * Set an array that the size is 5.
     */
    Coordinate *array = calloc(SIZE, sizeof(Coordinate));
    /*
     * The index is used to loop.
     */
    unsigned index = 0;

    for (index = 0; index < SIZE * 2; index++) {
        printf("[%u]=(%d, %d)\n",
                index,
                array[index].x,
                array[index].y);
    }

    free(array);
    array = NULL;

    return 0;
}
/* The end of source file */

编译后输出:

bash 复制代码
[0]=(0, 0)
[1]=(0, 0)
[2]=(0, 0)
[3]=(0, 0)
[4]=(0, 0)
[5]=(0, 0)
[6]=(0, 0)
[7]=(0, 0)
[8]=(0, 0)
[9]=(0, 0)

可以看到申请的内存长度为 SIZE = 5,但是循环输出次数为 SIZE * 2。存在逻辑错误却可以编译执行,还不会报错。 其是错误已经发生了。

相关推荐
Pretend° Ω7 小时前
LRU缓存详解:用C语言实现高效数据管理
运维·c语言·spring·缓存·lru·双向链表
我叫汪枫8 小时前
C语言深度入门系列:第十一篇 - 动态内存管理与数据结构:程序世界的高效算法大师
c语言·数据结构·算法
叫我木子12 小时前
c语言,识别到黑色就自动开枪,4399单击游戏狙击战场,源码分享,豆包ai出品
c语言·人工智能·游戏
l1t12 小时前
对expat库XML_Parse函数调用优化的测试
xml·c语言·解析器·expat
l1t13 小时前
利用美团龙猫添加xlsx的sheet.xml读取sharedStrings.xml中共享字符串输出到csv功能
xml·c语言·数据结构·人工智能·算法·解析器
l1t14 小时前
how to build tbox xml into the demo
xml·linux·c语言·parser·tbox
九皇叔叔15 小时前
【2】标识符
c语言
野生的编程萌新16 小时前
【C++深学日志】从0开始的C++生活
c语言·开发语言·c++·算法
Hello_Embed19 小时前
STM32HAL 快速入门(二十四):I2C 编程(一)—— 从 OLED 显示初识 I2C 协议
c语言·stm32·单片机·嵌入式硬件·学习
晨非辰21 小时前
#C语言——刷题攻略:牛客编程入门训练(十一):攻克 循环控制(三),轻松拿捏!
c语言·开发语言·经验分享·学习·visual studio