C语言合并两个数组时程序在合并循环处崩溃的问题求助
问题分析与修复方案
你的程序崩溃的核心原因是二级指针的错误使用,在array和display函数中,你错误地直接对二级指针进行下标访问,而没有先解引用得到实际的数组首地址,这会导致读写非法内存,触发崩溃。
错误点详解
array函数中的错误
原代码里scanf("%d",&a[i]);的a是int**类型,a[i]会被解析为指向int的指针数组元素,而非目标数组的元素地址,直接写入会破坏非法内存空间。display函数中的错误
原代码里printf("%d\t",a[i]);同样错误地访问二级指针的下标,导致读取非法内存,引发未定义行为。
修复后的完整代码
// To make two arrays of user Defined Size and merge them in a third array #include<stdio.h> #include<stdlib.h> void array(int**,int); void ini(int**,int); void display(int **,int); int main() { int *a1,*a2,*a3,s1,s2,i,j; printf("Enter Size of Array 1\n"); scanf("%d",&s1); printf("Enter Size of Array 2\n"); scanf("%d",&s2); ini(&a1,s1); ini(&a2,s2); ini(&a3,s1+s2); printf("Enter Elements of Array 1\n"); array(&a1,s1); printf("Array 1:\n"); display(&a1,s1); printf("Enter Elements of Array 2\n"); array(&a2,s2); printf("Array 2:\n"); display(&a2,s2); // 合并数组的逻辑本身无问题 for(i=0;i<s1;i++) { a3[i]=a1[i]; } for(i=0,j=s1;i<s2&&j<s1+s2;i++,j++) { a3[j]=a2[i]; } printf("Merged Array:\n"); display(&a3,s1+s2); // 释放动态分配的内存,避免内存泄漏 free(a1); free(a2); free(a3); return 0; } void ini(int **a,int s) { *a=(int*)calloc(s,sizeof(int)); } void array(int **a,int s) { int i; int *arr = *a; // 先解引用获取实际数组的首地址 for(i=0;i<s;i++) { printf("Enter Element at position %d\n",i+1); scanf("%d",&arr[i]); } } void display(int **a,int s) { int i; int *arr = *a; // 先解引用获取实际数组的首地址 for(i=0;i<s;i++) { if(i==s-1) printf("%d\n",arr[i]); else printf("%d\t",arr[i]); } }
额外优化建议
- 增加内存分配检查:
calloc可能返回NULL,建议在ini函数或调用后判断指针是否为空,避免空指针操作。 - 合并数组的第二个循环可简化为
for(i=0;i<s2;i++) a3[s1+i] = a2[i];,逻辑更简洁直观。
内容的提问来源于stack exchange,提问作者Lost One
相关产品推荐
相关产品推荐

