C语言动态数组基础操作:生成、插入、查找、修改与删除完整示例

晚来风
晚来风
发布时间:2026-10-14| 6人浏览过
原创

在C语言中,使用malloc动态分配内存是处理不确定大小数据的核心技巧。本文通过一个完整的控制台程序示例,演示如何对动态数组进行初始化、插入、查找、修改和删除操作,帮助读者掌握指针操作与内存管理的基本流程。

动态数组的基础构建与初始化

C语言标准库提供了malloc函数用于在堆内存中分配空间。在使用前,需定义全局变量或参数来管理数组的大小size与状态标志flag,以便在各功能函数间共享上下文。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int size = 0;
int flag = 0;

// 用于打印数组内容的辅助函数
void output(int *arry) {
    for (int i = 0; i < size; i++) {
        printf("arry[%d]=%d\t", i, arry[i]);
        if ((i + 1) % 5 == 0) printf("\n"); // 每5个换行显示
    }
    printf("\n");
}

// 生成随机数填充数组
void getarry(int *arry) {
    srand(time(NULL)); // 以当前时间为种子
    for (int i = 0; i < size; i++) {
        arry[i] = rand() % 100; // 生成0-99之间的随机数
    }
}

第1步:在指定位置插入元素

在数组中间或末尾插入新元素时,需要移动后续元素以腾出空间。此过程涉及边界判断与内存移位操作。

void add(int *arry, int pos, int num) {
    // 检查插入位置合法性
    if (pos >= 0 && pos <= size) {
        if (pos < size) {
            // 若插入非末尾位置,向后移动元素
            for (int i = size; i > pos; i--) {
                arry[i] = arry[i - 1];
            }
            arry[pos] = num;
        } else {
            // 直接在末尾追加
            arry[size] = num;
        }
        size++; // 更新数组大小
    } else {
        printf("只能在0-%d的位置插入。\n", size);
    }
}

第2步:查找特定数值的所有位置

由于search函数采用静态变量维护搜索进度,它可以配合循环查找重复值。注意flag标志位用于控制是否跳过当前已找到的位置。

int search(int *arry, int num) {
    static int pos = 0; // 保持搜索进度
    if (flag)
        pos++; // 若标志位为真,跳过当前位置
    
    for (; pos < size; pos++) {
        if (arry[pos] == num) {
            flag = 0;
            return pos; // 找到返回索引
        }
    }
    return -1; // 未找到
}

第3步:修改与删除元素

修改操作相对简单,只需验证索引范围。删除操作则需要找到所有匹配项,并将后续元素前移,同时减少size计数(注意原代码逻辑中删除后未显式减小size,此处保留原意但需注意实际使用中应更新size)。

void mod(int *arry, int pos, int num) {
    if (pos >= 0 && pos < size) {
        arry[pos] = num;
    } else {
        printf("输入位置错误。\n");
    }
}

int del(int *arry, int num) {
    int count = 0;
    int pos = search(arry, num);
    // 循环删除所有匹配项
    while (pos != -1) {
        for (int i = pos; i < size - 1; i++) {
            arry[i] = arry[i + 1];
        }
        size--; // 实际应减小size,原代码省略此步导致逻辑隐患
        count++;
        pos = search(arry, num); // 重新搜索可能存在的重复项
    }
    return count;
}

第4步:主函数执行流程

主函数负责交互流程:读取用户输入的初始大小,分配内存,初始化数据,并依次执行添加、查找、修改和删除操作,最后释放内存以避免泄漏。

int main() {
    int *arry = NULL;
    int count = 0;
    int pos = 0;
    int num = 0;

    printf("输入要产生多少个随机数:");
    scanf("%d", &size);
    
    // 分配两倍于所需大小的内存以防止后续插入时的边界溢出风险
    arry = malloc(2 * size * sizeof(int));
    
    getarry(arry);
    output(arry);

    // 1. 插入操作
    printf("输入要添加的位置(0-%d):", size);
    scanf("%d", &pos);
    printf("输入要添加的数字:");
    scanf("%d", &num);
    add(arry, pos, num);
    output(arry);

    // 2. 查找操作
    printf("输入要查找的数字:");
    scanf("%d", &num);
    pos = search(arry, num);
    count = 0;
    while (pos != -1) {
        flag = 1; // 设置标志以便下一次搜索跳过当前位置
        count++;
        printf("arry[%d]=%d\n", pos, num);
        pos = search(arry, num);
    }
    printf("共找到%d个匹配数字\n", count);

    // 3. 修改操作
    printf("输入要修改的位置:");
    scanf("%d", &pos);
    printf("输入要修改为数字:");
    scanf("%d", &num);
    mod(arry, pos, num);
    output(arry);

    // 4. 删除操作
    printf("输入要删除的数字:");
    scanf("%d", &num);
    // 注意:del函数内部未正确更新全局size,实际运行可能导致越界,建议修正
    del(arry, num); 
    output(arry);

    free(arry); // 释放内存
    arry = NULL;
    return 0;
}

注意事项与优化建议

上述代码展示了动态数组的基本骨架,但在实际工程应用中存在几处潜在风险:
1. 内存溢出:初始分配了2*size的空间,但add函数仅在pos <= size时进行操作,若多次插入可能导致超出分配范围。
2. 删除逻辑缺陷:del函数中循环移位后未更新全局size变量,这将导致后续操作访问非法内存或输出脏数据。
3. 资源释放:始终确保在程序结束前调用free()释放由malloc分配的内存。

以上就是C语言动态数组增删改查操作的详细内容,更多关于C语言基础教程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。