C语言合并两个有序数组时int**传参int*类型不兼容警告的修复方法
问题核心
编译器警告的直接原因是指针类型不匹配:
- 在main函数中存储合并结果的数组被声明为
int **v3,同时通过malloc(t3 * sizeof(int *))申请的是存放int *类型元素的空间,本质是一个存指针的数组,返回值类型为int **。 - 自定义的
interc2w、printVec函数要求传入的数组合法参数是int *(指向普通int元素的指针),将int **类型的变量传入自然触发类型不兼容警告。
修正方案
仅需调整动态分配合并结果数组的逻辑,两处核心修改点:
- 把数组的指针类型从
int **改为int *——因为数组要存的是普通整数,不是int指针。 - 把malloc申请的空间大小从
t3 * sizeof(int *)改为t3 * sizeof(int)——申请和整数元素匹配的空间大小。
调整后,v3的类型为int *,和函数要求的参数类型完全匹配,警告会直接消除,原有的递归合并逻辑无需改动即可正常工作。
补充优化:动态申请的内存需要用free(v3)手动释放,避免内存泄漏。
修正后完整可运行代码
#include <stdio.h> #include <stdlib.h> void printVec(int v[], int t){ printf("[ "); for(int i = 0; i < t; i++){ printf("%d ", v[i]); } printf("]"); } void interc2w(int a[], int ta, int b[], int tb, int c[], int tc, int i, int j, int k){ if(k < tc){ if(i < ta && j < tb) { if(a[i] < b[j]) { c[k] = a[i]; interc2w(a, ta, b, tb, c, tc, i+1, j, k + 1); } else { c[k] = b[j]; interc2w(a, ta, b, tb, c, tc, i, j+1, k + 1); } } else{ if(i == ta) { c[k] = b[j]; interc2w(a, ta, b, tb, c, tc, i, j+1, k + 1); } else if(j == tb) { c[k] = a[i]; interc2w(a, ta, b, tb, c, tc, i+1, j, k + 1); } } } else return; } int main(){ int v1[] = {5,12,19,21,30,50}, v2[] = {2,4,6,8,10,13,15,20,25,60}; int t1 = (sizeof(v1)/sizeof(v1[0])), t2 = (sizeof(v2) / sizeof(v2[0])), t3 = t1 + t2; // 替换原错误的动态分配逻辑:int **v3 = malloc(t3 * sizeof(int *)); int *v3 = malloc(t3 * sizeof(int)); printf("Vetor 1: "); printVec(v1, t1); interc2w(v1, t1, v2, t2, v3, t3, 0, 0, 0); printf("\n\nVetor 2: "); printVec(v2, t2); printf("\n\nVetor 3 intercalado: "); printVec(v3, t1 + t2); free(v3); return 0; }
运行验证
修正后程序无编译警告,可正确输出两个有序数组的升序合并结果。
内容的提问来源于stack exchange,提问作者user15329767
相关产品推荐
相关产品推荐

