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

为何除main函数外无法成功为一维数组分配空间?

问题原因分析与解决方案

核心问题:C语言的值传递机制

你遇到的问题本质是没搞懂C语言的参数传递规则——哪怕是指针类型,函数参数也是值传递。

在你的create函数里,values是main中nums的一个局部副本。当你调用malloc给values分配内存时,修改的只是这个副本的地址,main里的nums还是原来的未初始化野指针。所以回到main调用print时,你访问的是野指针指向的非法内存,自然得到垃圾值。

而create函数内部打印正常,是因为此时函数里的values是刚分配好的有效指针,指向的内存是合法的,能正常读写。

两种修复方案

方案1:使用二级指针传递(让函数修改原指针的地址)

修改create函数为接收二级指针,直接修改原指针的指向:

void create(int **values, int n ) {
    // 给原指针指向的内存地址分配空间
    *values = malloc(n*sizeof(int));
    for (int i=0; i<n; i++)
        // 注意括号,先解引用再访问数组元素
        (*values)[i] = rand()%100;
}

main里调用时需要传指针的地址:

int main() {
    int *nums, mid;
    srand(time(0));
    create(&nums, 30); // 传nums的地址
    print(nums, 30);
}

方案2:让函数返回分配好的指针

直接把create函数改成返回指针类型,让main接收分配好的地址:

int* create(int n ) {
    int *values = malloc(n*sizeof(int));
    for (int i=0; i<n; i++)
        values[i] = rand()%100;
    return values;
}

main里调用时直接赋值:

int main() {
    int *nums, mid;
    srand(time(0));
    nums = create(30); // 接收返回的指针
    print(nums, 30);
}

额外提醒

记得使用完动态分配的内存后,用free(nums)释放,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:27:16