C语言指针实现升序数组插入元素异常问题求助
问题分析与解决
你的代码在插入元素时出现首元素丢失,核心有两个问题:
1. 未对数组扩容
原数组通过malloc分配了n个int的内存空间,插入新元素后数组长度变为n+1,不扩容的话既无法容纳新元素,还会导致内存操作越界,直接覆盖原有数据。
2. 插入逻辑完全错误
- 循环
for (int * current = p; current != p + 1; ++current)毫无意义,仅会执行一次,且起始位置错误; - 当
pos == p时,*(pos-1)访问了数组首元素之前的非法内存,属于未定义行为; - 没有正确从后往前移动元素腾出插入位置,反而直接覆盖了原有元素。
修正后的完整代码
#include<stdio.h> #include<stdlib.h> int main() { int i, n, *p, v; printf("\n Entrer la taille du tableau:"); scanf("%d", &n); // 分配初始数组内存,增加空指针检查 p = malloc(n * sizeof(int)); if (p == NULL) { printf("内存分配失败\n"); return 1; } printf("Enter l'élément(s) 1:"); scanf("%d", p); // 初始输入时强制保持升序 for (i = 1; i < n; i++) { do { printf("Enter l'élément(s) %d:", i + 1); scanf("%d", (p + i)); } while (p[i] < p[i - 1]); } printf("\n Affichage du tableau\n"); for (i = 0; i < n; i++) { printf("%d ", *(p + i)); } /* 插入新元素到数组并保持升序 */ printf("\n Entrer la valeur de v: "); scanf("%d", &v); // 1. 扩容数组,长度变为n+1,检查扩容是否成功 int *new_p = realloc(p, (n + 1) * sizeof(int)); if (new_p == NULL) { printf("内存扩容失败\n"); free(p); return 1; } p = new_p; n += 1; // 更新数组长度 // 2. 找到插入位置:第一个大于v的元素的地址 int *insert_pos = p; while (insert_pos < p + n - 1 && *insert_pos < v) { insert_pos++; } // 3. 从后往前移动元素,腾出插入位置 for (int *current = p + n - 1; current > insert_pos; current--) { *current = *(current - 1); } // 4. 插入新元素 *insert_pos = v; // 输出结果 printf("\n插入后的数组:\n"); for (int *current = p; current != p + n; ++current) { printf("%d ", *current); } putchar('\n'); free(p); return 0; }
关键修改说明
- 内存扩容:使用
realloc重新分配内存,同时检查分配是否成功,避免内存泄漏; - 插入位置查找:遍历数组找到第一个大于待插入值的位置,确保插入后数组保持升序;
- 元素移动:从数组末尾开始向前移动元素,避免覆盖未移动的数据;
- 更新数组长度:插入后将数组长度
n加1,保证后续遍历和操作的正确性。
内容的提问来源于stack exchange,提问作者Med talib
相关产品推荐
相关产品推荐

