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

C语言中为何无法为指针数组分配内存?传址调用问题排查

问题原因及解决方案

你的代码核心问题是指针参数按值传递导致的修改无效,具体分析和修正如下:

问题根源

C语言中所有参数都是值传递,包括指针。当你在main里把指针A传给arrayInput的int *A参数时,函数会创建一个和原指针同名的局部副本。你在函数里用malloc给这个局部指针分配内存,只是修改了副本的值,函数执行结束后这个局部变量就被销毁了,main里的原指针A仍然是初始的空指针状态。

而sizeof(A)测量的是指针本身的大小(64位系统下固定为8字节),和它指向的内存大小无关,这就是为什么你得到输出5, 8,而不是预期的5, 20。

修正方案

要修改main里的原指针,必须传递指针的指针(即int **A),让函数能通过间接访问修改原指针的指向。

修正后的代码

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

void arrayInput(int **A, int *size) {
    printf("Enter the size of the array: ");
    scanf("%d", size);

    // 通过指针的指针,修改原指针的指向
    *A = (int*)malloc(sizeof(int) * (*size));  
}

int main(int argc, char **argv) {
    int *A = NULL, array_size = 0;
    arrayInput(&A, &array_size);
    
    // 手动计算内存总字节数(sizeof无法直接获取动态分配的内存大小)
    printf("%d, %d\n", array_size, sizeof(int) * array_size);
    
    // 释放动态分配的内存,避免泄漏
    free(A);
    return 0;
}

关键修正点

  1. 函数参数改为int **A,接收main中指针A的地址
  2. 用*A = malloc(...)将分配的内存地址赋值给原指针,让main里的A指向新分配的内存
  3. 动态分配的内存大小无法用sizeof直接获取,需要手动计算sizeof(int) * array_size
  4. 添加free(A)释放内存,避免内存泄漏

补充说明

  • 建议在使用malloc后检查返回值,如果返回NULL说明内存分配失败,需要做错误处理
  • 传址调用的核心是传递要修改变量的地址,对于指针变量来说,它的地址就是指针的指针

内容的提问来源于stack exchange,提问作者3rdgrade-dropout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:45:45