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

C语言copyArray函数异常问题咨询:需复制指针数组保留原数组

分析copyArray函数无法正常工作的原因及修复方案

你的copyArray函数存在两个致命问题,直接导致它无法正确返回新数组的指针:

1. 返回值类型声明错误

你把函数的返回类型声明为int,但实际上我们需要返回的是指向int数组的指针,也就是int*。这种类型不匹配会让编译器把你原本的指针地址隐式转换成整数,丢失正确的内存地址信息——后续用这个错误的值去访问数组,必然会触发内存访问错误或者输出乱码。

2. 返回的内容错误

函数最后写的是return *z;,这是取z指针指向的第一个元素的值(一个整数),而不是返回z本身(新分配数组的首地址)。这完全违背了“返回新数组指针”的需求。

修复后的copyArray函数

我们只需要修正这两个问题,就能让函数正常工作:

/* 复制数组,返回指向同尺寸同值新数组的新指针 */
int* copyArray(int *p, int length) {
    // 可选但推荐:检查输入合法性
    if (p == NULL || length <= 0) {
        return NULL;
    }
    int *z = (int*)malloc(length*sizeof(int));
    // 必须:检查malloc是否成功分配内存,避免空指针访问
    if (z == NULL) {
        return NULL;
    }
    // 正向遍历复制,逻辑更直观(反向遍历也可以,只要返回z即可)
    for(int i = 0; i < length; i++) {
        z[i] = p[i];
    }
    // 返回新数组的首地址
    return z;
}

额外补充说明

  • 循环改成正向遍历只是为了逻辑更清晰,你也可以保留原来的反向写法,核心是要返回z而不是*z。
  • 加上输入合法性检查和malloc失败判断,是写出健壮C代码的好习惯,能避免很多潜在崩溃问题。
  • 记得在使用完z指向的数组后,调用free(z);释放内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:26:49