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

C语言自制ArrayList返回指针后数组输出异常求助

自行实现ArrayList时的常见问题分析与修复

问题核心现象

在模拟ArrayList的实现中,createArrayList函数内部创建局部数组,置0后返回指针;主函数调用后使用outputArray输出,预期10行0却仅输出8行;修改指定位置元素后,输出出现异常值(随机数、错误的元素位置),且clearList和outputArray依赖sizeof计算数组长度。

根本原因

  1. 野指针与栈内存失效
    createArrayList中的数组是局部栈变量,函数执行完毕后栈帧会被销毁,返回的指针指向的内存区域已被释放,后续对该指针的读写属于未定义行为——内存可能被其他栈操作覆盖,导致输出异常或随机值。

  2. sizeof的误用
    当数组作为参数传递给函数时,会自动退化为指针类型,此时sizeof(数组参数)获取的是指针的大小(如64位系统为8字节),而非数组的总字节数。用sizeof(arr)/sizeof(arr[0])计算元素个数时,结果完全错误,这就是输出行数不符的直接原因。

修复方案

1. 改用堆内存分配

放弃局部栈数组,使用malloc动态分配堆内存,确保返回的指针在函数结束后依然有效:

#include <stdlib.h>
#include <string.h>

// 创建指定大小的ArrayList(堆内存版)
int* createArrayList(int size) {
    // 分配size个int的内存空间
    int* arr = malloc(size * sizeof(int));
    if (arr == NULL) {
        // 内存分配失败,返回空指针
        return NULL;
    }
    // 将所有元素置0(替代clearList)
    memset(arr, 0, size * sizeof(int));
    return arr;
}

2. 显式传递数组长度

所有操作数组的函数(如clearList、outputArray)必须额外接收数组长度参数,不再依赖sizeof推导:

#include <stdio.h>

// 输出数组元素
void outputArray(int* arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d\n", arr[i]);
    }
}

// 主函数示例
int main() {
    const int listSize = 10;
    int* arrayList = createArrayList(listSize);
    
    if (arrayList != NULL) {
        arrayList[2] = 10;
        outputArray(arrayList, listSize);
        // 用完后释放堆内存,避免内存泄漏
        free(arrayList);
    }
    
    return 0;
}

额外注意事项

  • 堆内存分配后必须检查malloc的返回值,避免空指针操作。
  • 使用完动态分配的数组后,必须调用free释放内存,防止内存泄漏。
  • 如果需要更接近Java ArrayList的功能(动态扩容、元素类型通用),可以封装一个结构体,包含指针、当前长度、容量三个字段,进一步完善逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:55:37