You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用指针合并有序数组时存储地址而非值的问题修复求助

修复你的有序数组合并代码问题

嘿,作为指针新手,你遇到的这个“存储地址而非变量值”的问题,其实是由几个关键的语法和逻辑错误导致的,咱们一步步来解决:

首先,排查核心错误点

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:32:44