使用指针合并有序数组时存储地址而非值的问题修复求助
修复你的有序数组合并代码问题
嘿,作为指针新手,你遇到的这个“存储地址而非变量值”的问题,其实是由几个关键的语法和逻辑错误导致的,咱们一步步来解决:
首先,排查核心错误点
1. 函数调用时的指针传递错误
你在main函数里调用interclas时写了:
interclas(ptr,vec,&c,n);
但c本身就是int*类型的指针(指向你malloc出来的合并数组),传递&c会把指针本身的地址(也就是int**二级指针)传给函数,而你的interclas函数参数是int *c,这就导致函数里操作的不是合并数组的内存,自然存的不是正确的值。
修正: 直接传递c即可:
interclas(ptr,vec,c,n);
2. For循环的语法完全错误
你的interclas函数里的循环写法完全不符合C语言for循环的结构:
for (i=0;i++;i<n) for (j=0;i++;j<n)
C语言for循环的结构是for(初始化; 循环条件; 增量),你把增量和循环条件的位置搞反了,这会导致循环一开始就终止,或者出现越界访问。
更重要的是——合并有序数组根本不能用嵌套循环,嵌套循环会重复插入元素,生成n*n个元素,而我们只需要2n个。
3. 有序数组合并的逻辑错误
你当前的嵌套循环逻辑是把两个数组的每个元素都两两比较插入,这不是合并有序数组的正确方式。正确的做法是用双指针遍历法:
- 用
i遍历第一个有序数组ptr,j遍历第二个有序数组vec - 用
tmp遍历合并后的数组c - 每次比较
ptr[i]和vec[j],把较小的元素放入c[tmp],然后移动对应的指针(i++或j++),同时tmp++ - 当其中一个数组遍历完后,把另一个数组剩下的元素依次放入
c
修正后的完整代码
#include <stdio.h> #include <stdlib.h> void interclas(int *ptr, int *vec, int *c, int n) { int i = 0, j = 0, tmp = 0; // 双指针遍历两个有序数组,合并较小元素 while (i < n && j < n) { if (vec[j] <= ptr[i]) { c[tmp] = vec[j]; j++; } else { c[tmp] = ptr[i]; i++; } tmp++; } // 处理第一个数组剩下的元素 while (i < n) { c[tmp] = ptr[i]; i++; tmp++; } // 处理第二个数组剩下的元素 while (j < n) { c[tmp] = vec[j]; j++; tmp++; } } int main() { int i, n; int *ptr, *vec, *c; printf("Nr. of elements of initial arrays : 5 \n"); n = 5; // 分配内存并检查是否成功 vec = (int*)malloc(n * sizeof(int)); ptr = (int*)malloc(n * sizeof(int)); c = (int*)malloc(2 * n * sizeof(int)); if (!vec || !ptr || !c) { printf("Memory allocation failed!\n"); return 1; } printf("Enter elements for first array: "); for (i = 0; i < n; i++) { scanf("%d", &ptr[i]); } printf("Enter elements for second array: "); for (i = 0; i < n; i++) { scanf("%d", &vec[i]); } printf("\nInitial arrays are : \n"); for (i = 0; i < n; i++) { printf("%d ", ptr[i]); } printf("\n"); for (i = 0; i < n; i++) { printf("%d ", vec[i]); } printf("\n"); // 正确传递指针 interclas(ptr, vec, c, n); printf("Merged array is : "); for (i = 0; i < 2 * n; i++) { printf("%d ", c[i]); } printf("\n"); // 释放分配的内存,避免泄漏 free(vec); free(ptr); free(c); return 0; }
额外的优化建议
- 每次malloc后最好检查是否分配成功,避免空指针访问
- 使用完动态分配的内存后,一定要用
free()释放,避免内存泄漏 - 输入时可以加一些提示信息,让用户更清楚要输入什么
内容的提问来源于stack exchange,提问作者manubmxnsb
相关产品推荐
相关产品推荐

