C语言字符串与指针易错点复盘

📅 2026/8/2 1:39:19
C语言字符串与指针易错点复盘
前言在C语言学习过程中 sizeof 、 strlen 、数组名、指针的区分是高频易错点也是看懂内存布局的关键基础。本篇整理学习笔记厘清字符串数组、字符指针、标准库字符串函数的坑点。一、 sizeof 和 strlen 核心区别1. sizeof 运算符计算占用内存字节数- 数组名传给 sizeof sizeof(arr) 得到整个数组总字节大小- arr0 、 arr 单独参与表达式退化为首元素地址- arr 是整个数组的地址地址数值和数组首地址一样但类型是数组指针重点只要不是直接写 sizeof(数组名) 数组名都会退化为首元素指针。2. strlen() 库函数统计有效字符长度遇到 \0 停止计数不包含末尾结束符 \0 **致命坑strlen(*arr) 直接传字符值不是字符串起始地址程序直接崩溃。strlen只接收字符串首地址作为参数。示例对比cchar arr[] abcdef;// sizeofsizeof(arr); //76个字符 \0sizeof(arr0); //指针大小64位系统8字节sizeof(*arr); //*arr等价arr[0]单个char占1字节sizeof(arr); //数组地址指针大小8字节// strlenstrlen(arr); //6strlen(arr); //可以运行地址数值一致长度6strlen(arr1); //跳到数组后面的内存随机值野内存strlen(arr[0]1);//从下标1开始结果5char指针形式字符串cchar *p abcdef;strlen(p); //6strlen(p1); //5// strlen(*p); //崩溃*p是字符a不是地址sizeof(p); //指针大小8字节不是字符串长度sizeof(*p); //1小结数组内存连续存着 a b c d e f \0 指针pp变量保存字符串常量的首地址字符串常量放在只读内存。二、二维数组 sizeof 快速计算cint arr[3][4] {0};sizeof(arr); //3*4*4 48sizeof(arr[0][0]); //单个int占4sizeof(arr[0]1); //arr[0]退化成指针8字节sizeof(*(arr1)); //arr1是第二行数组地址解引用一行数组4*416sizeof(arr[0]1); //地址8字节sizeof(*(*(arr1)));//取到int值4字节三、字符串处理函数string.h1. strcmp(str1,str2)按ASCII逐字符比较- str1 str2 返回 -1- 相等返回 0- str1 str2 返回 12. strncpy(dst, src, n)拷贝n个字符不会自动补 \0 容易出现字符串没有结束符后续访问乱码。工程规范尽量少用不安全的 strcpy 优先带长度限制版本。3. strncat追加字符串最多追加n个字符追加结束后自动补上 \0 终止符。4. strncmp 指定比较前n个字符。5. strstr(str1,str2) 在str1查找str2第一次出现的位置返回对应指针。6. strtok 字符串分割函数会直接修改原字符串内部保存静态指针多次分割传 NULL 不能用于字符串常量。7. strerror(errno) 根据错误码打印错误描述。四、踩坑总结1. 分清**数组本身、数组首元素地址、数组指针 arr **三者类型差异2. strlen 参数必须是字符串起始地址不能传入单个字符3. 字符串常量 char *pxxx 存放在只读段不要尝试修改4. strcpy 无长度检查容易缓冲区溢出工程代码优先使用带长度限制函数5. strtok 有静态变量记忆位置多线程不安全不要在循环嵌套分割。https://gitcode.com/gcw_RyL6LF93/study‑c‑languague.git