非数组的指针.md

← 返回 MOC | ← 主页


1. 基础用法:动态向系统“要空间”

图中代码 r = malloc(strlen(s) + strlen(t)); 的意图是:根据字符串 st 的长度,动态申请一块内存来存放合并后的结果。

  • 它的作用 :在程序运行时(Runtime)决定需要多少内存,而不是在编译时写死。
  • 它的返回值 :成功时返回那块空间的 起始地址 ;失败时返回 NULL

2. 三个“致命”陷阱

书里列出的三个原因,其实就是 malloc 的“使用说明书”:

原因一:必须检查返回值(预防崩溃)

书中原意malloc 并不保证一定能成功。如果电脑内存满了,它会返回一个“空指针”(NULL)。

  • 错误写法 :直接用 rstrcpy。如果 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();

本章小结

111