一、核心差异两处 p 是完全独立变量1. 一级指针传参场景非法形参p是外部指针的值拷贝副本和外部原指针分属两块独立栈变量。执行p malloc()仅修改副本保存的地址外部指针完全不变堆地址丢失造成内存泄漏。2. return 返回场景合法函数内手动定义局部指针p不存在外部传入副本。return p把堆地址数值拷贝赋值给外部变量函数销毁局部p不影响堆内存地址可正常访问、释放。二、正反对照代码和正文示例统一示例 1 错误写法一级指针入参 malloc#include stdio.h #include stdlib.h #include string.h void getmemory(char *p) { p (char *)malloc(100); // 只修改临时副本p strcpy(p, hello world!); } int main() { char *str NULL; getmemory(str); printf(%s\n,str); free(str); return 0; }运行结果str 始终等于 NULLprintf 访问空指针程序直接崩溃malloc 分配的堆内存没有任何指针记录地址永久丢失内存泄漏。示例 2 正确写法内部局部指针 return 返回堆地址#include stdio.h #include stdlib.h #include string.h char* getmemory(void) { char *p (char *)malloc(100); // 函数自有局部指针非传入副本 strcpy(p, hello world!); return p; // 将堆地址拷贝给外部str } int main() { char *str getmemory(); printf(%s\n,str); free(str); return 0; }运行结果str 拿到合法堆内存地址正常打印字符串 hello world!free 正常释放堆内存无泄漏、无崩溃。三、极简总结传参 p 只是外部指针副本malloc 新地址无法同步到外部函数自建局部 p依靠 return 直接导出有效堆地址两段代码里的 p 完全互不干扰。