C语言动态数组基础操作:生成、插入、查找、修改与删除完整示例
在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语言基础教程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













