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

C语言新手求助:修改整数数组后返回指针失败问题

问题分析

你的代码核心问题是返回了局部数组的指针。函数里的int b[10];是栈上的局部变量,当函数执行完毕返回时,栈上的局部变量会被系统回收,内存空间不再属于这个数组,此时返回的指针指向的是已经无效的内存,后续使用这个指针会导致未定义行为。

另外还有两个明显问题:

  • 你在循环里直接对b进行自增操作,b是数组名,本质是常量指针,不能直接b++,这会触发编译报错。
  • 循环只复制到*a为0的时候,但没有给目标数组加上结束的0(如果原数组是以0结尾的话),同时没处理原数组长度超过10的情况,会导致数组越界。
解决方法

根据需求,有几种常见的正确实现方式:

方式1:让调用者提供目标数组(最安全)

这种方式把内存管理交给调用者,避免内存泄漏或野指针问题:

int *h(int *a, int *b, int max_len) {
    int *start = b; // 保存数组起始地址,最后返回
    // 循环复制,同时防止越界,留一个位置存结束符
    while (*a && (b - start < max_len - 1)) {
        *b = *a;
        b++;
        a++;
    }
    *b = 0; // 添加结束标记,和原数组格式一致
    return start;
}

调用示例:

int main() {
    int arr[] = {1,2,3,4,0};
    int result[10];
    int *p = h(arr, result, 10);
    // 这里可以用p操作result数组
    return 0;
}

方式2:函数内动态分配内存

如果不想让调用者提前准备数组,可以用malloc在堆上分配内存,注意调用者必须手动释放内存:

#include <stdlib.h>

int *h(int *a) {
    // 先计算原数组长度(假设以0结尾)
    int len = 0;
    int *temp = a;
    while (*temp++) {
        len++;
    }
    // 分配内存,+1是为了存结束的0
    int *b = (int*)malloc((len + 1) * sizeof(int));
    if (b == NULL) { // 必须检查内存分配是否成功
        return NULL;
    }
    // 复制数据到新数组
    temp = b;
    while (*a) {
        *temp = *a;
        temp++;
        a++;
    }
    *temp = 0; // 添加结束标记
    return b;
}

调用示例:

int main() {
    int arr[] = {1,2,3,4,0};
    int *p = h(arr);
    if (p != NULL) {
        // 使用p操作数组
        free(p); // 必须释放内存,避免内存泄漏
    }
    return 0;
}

方式3:使用静态数组(不推荐)

可以把b定义为static int b[10];,这样数组会存在静态存储区,函数结束后不会被销毁。但这种方式有缺陷:静态数组是全局共享的,多次调用函数会覆盖之前的数据,而且长度固定,灵活性差,仅适合简单场景。

内容的提问来源于stack exchange,提问作者user23116654

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:03:26