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

为何在函数内分配内存时需使用&符号?C语言内存分配疑问

为什么调用Allocate必须传&p?

要搞懂这个问题,核心得抓住C语言的函数参数是值传递这个规则,再结合你的Allocate函数的功能来看:

1. Allocate函数的参数类型决定了传参要求

你的Allocate函数定义是:

void Allocate(struct cell **p) {
  (*p) = malloc(sizeof(struct cell));
}

它的参数是二级指针,作用是接收一个一级指针变量的地址,这样函数内部才能通过*p直接修改那个外部的一级指针变量的内容(也就是让它指向malloc分配的新内存地址)。

2. 直接传p为什么不行?

Makelist里的p是struct cell *类型的一级指针。如果直接写Allocate(p),会出现两个问题:

  • 类型不匹配:一级指针和二级指针类型不兼容,编译器会报错(或警告);
  • 就算强制转换,值传递的规则会导致函数里修改的只是形参的副本,外部的p根本不会被改变——函数结束后,你原来的p还是未初始化的垃圾值,后续操作必然出问题。

3. 传&p的本质是什么?

&p是取一级指针变量p的地址,得到的是struct cell **类型的二级指针,刚好匹配Allocate的参数类型。这时候函数里的*p就等价于外部的p变量,执行(*p) = malloc(...)时,就是直接把新分配的内存地址赋值给Makelist里的p,这样外部的指针才能正确指向新节点。

关于你说的main函数无需加&的情况

你提到main里调用不用加&也能运行,大概率是main里的变量本身就是二级指针(比如struct cell **head),这时候传变量名就是二级指针,和Allocate的参数匹配;如果main里是一级指针(比如struct cell *head),那必须传&head才能让Allocate修改它的指向,否则同样会出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:12:12