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

C语言内存分配问题:自定义函数分配内存无输出无报错,main中分配正常

问题原因

C语言的函数参数默认采用值传递规则,allocateMem函数的形参int *a是外层实参ptr的临时拷贝,函数内部对a的赋值仅会修改这个临时变量存储的地址值,完全不会影响main函数中ptr本身的取值。
调用allocateMem结束后,ptr仍然是未初始化的野指针,后续对ptr[0]、ptr[1]的写入、printf输出、free释放操作都属于访问非法内存的未定义行为,会出现无输出、无报错、崩溃等随机异常表现。

修复方案

有两种常用的修复方式:

方案1:让内存分配函数返回申请到的指针

#include <stdio.h>
#include <stdlib.h>

int* allocateMem()
{
    return (int*)malloc(5 * sizeof(int));
}

int main()
{
    int *ptr = allocateMem();
    // 必须判断内存分配是否成功
    if (ptr == NULL) {
        perror("内存分配失败");
        return 1;
    }
    ptr[0] = 5454;
    ptr[1] = 54;
    printf("Hi %d\n", ptr[1]);
    free(ptr);
    return 0;
}

方案2:传入二级指针修改外层一级指针的取值

#include <stdio.h>
#include <stdlib.h>

void allocateMem(int **a)
{
    *a = (int*)malloc(5 * sizeof(int));
}

int main()
{
    int *ptr;
    allocateMem(&ptr);
    // 必须判断内存分配是否成功
    if (ptr == NULL) {
        perror("内存分配失败");
        return 1;
    }
    ptr[0] = 5454;
    ptr[1] = 54;
    printf("Hi %d\n", ptr[1]);
    free(ptr);
    return 0;
}

  • 两种方案都建议新增动态内存分配的返回值校验,避免分配失败后访问空指针引发额外异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:54:07