C语言实现数组插入函数时触发Segmentation fault问题求助
数组插入函数段错误问题排查
问题出在这几个关键地方:
while循环逻辑彻底搞反了
你写的i += 1是让下标不断增大,本来要从数组最后一个元素(N-1)开始,把元素往后挪给新元素腾位置,结果i越跑越大,直接访问数组边界外的内存,无限循环下去,触发段错误。正确的应该是i--,让i从N-1递减到P,依次把A[i]移到A[i+1]。固定数组没留插入空间
你定义的arr[5]是栈上的固定大小数组,只有5个元素的空间。插入新元素后数组要变成6个元素,这时候写入A[5]就属于越界写内存,也是触发段错误的原因。要么提前定义更大的数组(比如arr[6]),要么用动态内存分配(malloc/realloc)来扩容。返回值毫无意义
你函数返回*A只是返回数组第一个元素,这根本不是插入操作该返回的内容,通常可以返回新的数组长度,或者返回0/-1表示操作成功/失败。
修正后的代码
#include <stdio.h> // 返回新数组长度,失败返回-1 int insert(int A[], int maxSize, int currentSize, int pos, int key) { // 先检查合法性:位置不能非法,数组还有空间 if (pos < 0 || pos > currentSize || currentSize >= maxSize) { return -1; } // 从后往前挪元素,给新元素腾位置 for (int i = currentSize - 1; i >= pos; i--) { A[i + 1] = A[i]; } A[pos] = key; return currentSize + 1; } int main(void) { // 定义大一点的数组,留一个插入位置 int arr[6] = {1, 2, 3, 4, 5}; int currentSize = 5; // 当前有效元素数 int pos = 3; int key = 2; int newSize = insert(arr, 6, currentSize, pos, key); if (newSize == -1) { printf("插入失败,位置非法或数组已满\n"); return 1; } // 打印结果看看 printf("插入后的数组:"); for (int i = 0; i < newSize; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
额外提醒
如果想让数组能灵活扩容,别用固定大小的栈数组,用malloc分配堆内存,插入时用realloc扩容,这样就不用提前预估大小了。另外,任何数组操作前都要做合法性检查,避免越界访问。
内容的提问来源于stack exchange,提问作者Dollar X
相关产品推荐
相关产品推荐

