C语言malloc指针传参错题总结
一、错误版:一级指针传参(核心bug)
错误点
1. 函数传参是值拷贝,修改形参p不影响外部str
2. str一直为NULL,strcpy空指针崩溃
3. malloc地址丢失,产生内存泄漏
方案1:二级指针 char**
原理
1. 传入指针变量地址 &str
2. *p 直接操作外部str,完成赋值
方案2:函数返回指针(替代二级指针)
原理
1. 函数内部存malloc地址,return传回外部
2. 外部变量接收返回值,无需二级指针
3. 原函数参数无作用,可删除
通用必守规范(三套代码共同坑点)
1. 缺头文件:stdio.h/string.h/stdlib.h
2. 不校验malloc返回NULL,易崩溃
3. printf(str)不安全,标准写法printf("%s",str)
4. malloc不配对free → 内存泄漏
5. free后指针不置空 → 野指针隐患
核心区分短句
改指针指向的数据:一级指针
改指针自身存储的地址:二级指针 / 函数返回指针
二、函数返回数组地址(栈/静态/堆对比)
1. 普通局部数组(栈区,产生野指针)
函数结束栈内存销毁,返回失效地址
2. static修饰局部数组(静态区,安全)
static变量存全局静态区,函数结束内存不销毁
3. malloc堆内存(堆区,安全,需手动释放)
堆内存不受函数生命周期限制,用完必须free
三、野指针知识点+对应代码
定义
指针存储无效、不受系统管控的内存地址,访问会乱码、程序崩溃
野指针三种产生场景
1. 未初始化指针
2. 返回普通栈局部变量地址(上方已附代码)
3. free后指针未置空
空指针 vs 野指针
- 空指针: p = NULL ,固定指向地址0,操作系统有保护,不会崩溃
- 野指针:随机无效内存地址,无保护,极易程序崩溃
规避野指针三规则
1. 指针定义时立即初始化( NULL /有效地址)
2. 禁止返回普通栈局部数组的地址
3. free 释放内存后,立刻将指针赋值为 NULL
