数组基础
一维数组声明与初始化、下标访问、越界问题
数组基础
数组是一片连续的内存空间,存放相同类型的数据。C 的数组没有边界检查——越界是沉默的杀手。
学完本章你将: 掌握一维数组的声明、初始化、下标访问、大小计算。
声明与初始化
c
#include <stdio.h>
int main() {
// 声明 + 初始化
int arr[5] = {10, 20, 30, 40, 50};
// 部分初始化(其余为 0)
int nums[5] = {1, 2}; // {1, 2, 0, 0, 0}
// 省略长度(编译器自动算)
int scores[] = {85, 92, 78}; // 长度为 3
// 全零初始化(只有 = {0} 能实现)
int zeros[100] = {0};
// ⭐ 注意:int zeros[100] = {} 在 C 中是非法的(C23 之前)
return 0;
}
下标访问
c
int arr[5] = {10, 20, 30, 40, 50};
printf("%d\n", arr[0]); // 10(下标从 0 开始)
printf("%d\n", arr[3]); // 40
arr[2] = 99; // 修改
// 遍历数组
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
数组大小计算
c
int arr[5] = {1, 2, 3, 4, 5};
size_t len = sizeof(arr) / sizeof(arr[0]); // 20 / 4 = 5
// ⚠️ 这个技巧只在声明数组的同一个函数内有效!
// 把数组传给函数后,sizeof 只能拿到指针的大小
越界访问 —— 沉默的内存破坏者
c
int arr[5] = {1, 2, 3, 4, 5};
arr[5] = 999; // ❌ 越界!写入 arr[4] 之后的内存
// 编译器不报错,运行时可能:
// - 覆盖其他变量(最可怕)
// - 段错误(Segmentation Fault)(最好的结果)
// - 什么也没发生(下次其他地方崩溃)
printf("%d\n", arr[10]); // ❌ 读取越界,输出随机值
⚠️ C 语言不检查数组边界。 越界是 C 语言最常见的 bug 来源之一,也是很多安全漏洞(缓冲区溢出)的根本原因。