非数组的指针.md
1. 基础用法:动态向系统“要空间”
图中代码 r = malloc(strlen(s) + strlen(t)); 的意图是:根据字符串 s 和 t 的长度,动态申请一块内存来存放合并后的结果。
- 它的作用 :在程序运行时(Runtime)决定需要多少内存,而不是在编译时写死。
- 它的返回值 :成功时返回那块空间的 起始地址 ;失败时返回 NULL 。
2. 三个“致命”陷阱
书里列出的三个原因,其实就是 malloc 的“使用说明书”:
原因一:必须检查返回值(预防崩溃)
书中原意 :malloc 并不保证一定能成功。如果电脑内存满了,它会返回一个“空指针”(NULL)。
- 错误写法 :直接用
r去strcpy。如果r是 NULL,程序会直接崩溃(段错误)。 - 正确做法 : C
r = malloc(size);
if (r == NULL) {
// 处理错误,比如报错并退出
}
原因二:必须手动释放(预防内存泄漏)
书中原意 :普通的局部变量(如 char r[100])在函数结束时会自动消失,但 malloc 申请的空间 永远不会自动释放 。
- 后果 :如果你一直申请但不释放,程序运行久了就会耗光系统内存(内存泄漏)。
- 正确做法 :使用完后,必须调用
free(r);。
原因三:最重要的一点——记得加 1(预防越界)
书中原意 (虽然最下面被手挡住了,但这是 C 语言最经典的坑):strlen 函数计算的是字符串的 可见字符长度 ,它不包含末尾的结束符 \0。
- 错误逻辑 :如果
s是 “abc” (长度3),t是 “def” (长度3),strlen(s) + strlen(t)等于 6。 - 实际需求 :存下 “abcdef” 需要 7 个字节(最后一个字节要存
\0)。 - 正确写法 : C
r = malloc(strlen(s) + strlen(t) + 1); // 必须 +1 留给 '\0'
3. 特别说明:书中那行奇怪的声明
书中有一行:char *r, *malloc();
这是一种 老派的 C 语言写法 (在还没有 void * 类型的年代)。
- 在现代 C 语言中,我们通常直接包含头文件
#include <stdlib.h>,而不需要手动声明extern void *malloc();。