C语言数组插入中间元素后最后元素丢失,求错误原因排查
问题排查与解决方案
你的代码存在两个核心问题,直接导致了元素丢失和出现未知值的情况:
1. 栈数组无法自动扩容,越界访问触发未定义行为
C语言中,在栈上声明的数组(比如main里的arr)大小是编译时固定的,你的原数组只有5个元素的存储空间(索引0~4)。但你试图插入第6个元素,还在循环里打印6个值,这会超出数组的内存范围,访问到栈上的随机垃圾数据——你看到的那个5就是这种未定义行为的结果。
2. 插入函数硬编码索引,导致越界操作
resize函数里的循环从i=5开始,而原数组的最大有效索引是4,访问arr[5]已经属于越界,会破坏栈上的其他数据,进一步加剧未定义行为。
修正方案1:用预先分配足够空间的栈数组
如果想用栈数组实现,需要提前声明容量足够的数组,并传递当前有效元素个数给插入函数,避免硬编码索引:
#include <stdio.h> // 添加当前有效元素个数参数,同时检查插入位置合法性 void insertIntoArray(int arr[], int currentLen, int position, int value) { // 确保插入位置是首尾以外的内部位置 if (position <= 1 || position >= currentLen) { printf("插入位置不合法,需选择首尾以外的位置\n"); return; } // 从最后一个有效元素的下一位开始,向后移动元素 for (int i = currentLen; i >= position; i--) { arr[i] = arr[i - 1]; } arr[position - 1] = value; } int main(void) { // 提前声明容量为6的数组,前5个是原数据,最后一个作为占位 int arr[] = {10, 20, 60, 80, 10, 0}; int currentLen = 5; // 当前有效元素的数量 insertIntoArray(arr, currentLen, 3, 90); currentLen++; // 插入后有效元素数量+1 // 只遍历有效元素,避免访问未初始化内存 for (int i = 0; i < currentLen; i++) { printf("%d\n", arr[i]); } }
修正方案2:用动态内存实现可变大小数组
如果需要更灵活的数组大小(比如不确定插入次数),建议用malloc/realloc实现动态数组:
#include <stdio.h> #include <stdlib.h> // 动态扩容并插入元素,返回新的数组指针 int* insertIntoDynamicArray(int* arr, int currentLen, int position, int value) { if (position <= 1 || position >= currentLen) { printf("插入位置不合法\n"); return arr; } // 重新分配内存,容量增加1 int* newArr = realloc(arr, (currentLen + 1) * sizeof(int)); if (newArr == NULL) { printf("内存分配失败\n"); return arr; } // 移动元素腾出插入位置 for (int i = currentLen; i >= position; i--) { newArr[i] = newArr[i - 1]; } newArr[position - 1] = value; return newArr; } int main(void) { int currentLen = 5; // 动态分配初始内存 int* arr = malloc(currentLen * sizeof(int)); if (arr == NULL) { printf("内存分配失败\n"); return 1; } // 初始化数组元素 arr[0] = 10; arr[1] = 20; arr[2] = 60; arr[3] = 80; arr[4] = 10; arr = insertIntoDynamicArray(arr, currentLen, 3, 90); currentLen++; // 遍历打印所有有效元素 for (int i = 0; i < currentLen; i++) { printf("%d\n", arr[i]); } free(arr); // 记得释放动态分配的内存,避免泄漏 return 0; }
内容的提问来源于stack exchange,提问作者Samapti Bhandari
相关产品推荐
相关产品推荐

