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; }
关键修正点
- 函数参数改为
int **A,接收main中指针A的地址 - 用
*A = malloc(...)将分配的内存地址赋值给原指针,让main里的A指向新分配的内存 - 动态分配的内存大小无法用
sizeof直接获取,需要手动计算sizeof(int) * array_size - 添加
free(A)释放内存,避免内存泄漏
补充说明
- 建议在使用
malloc后检查返回值,如果返回NULL说明内存分配失败,需要做错误处理 - 传址调用的核心是传递要修改变量的地址,对于指针变量来说,它的地址就是指针的指针
内容的提问来源于stack exchange,提问作者3rdgrade-dropout
相关产品推荐
相关产品推荐

