Z
ZHANK
数组与字符串

数组基础

一维数组声明与初始化、下标访问、越界问题

数组基础

数组是一片连续的内存空间,存放相同类型的数据。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 来源之一,也是很多安全漏洞(缓冲区溢出)的根本原因。