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