You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中char指针指针场景下malloc(0)为何不报错?附split函数疑问

C语言split函数中malloc(0)的行为解析

首先得明确:malloc(0)的行为在C标准里是未完全规定的——不同编译器/系统实现里,它要么返回一个NULL,要么返回一个不能存数据但可以用free()释放的非空指针(比如glibc就是返回后者)。这是你代码能“正常运行”的核心前提。

为什么malloc(0)时程序没崩?

你的split函数里用了两次malloc(0),结合strtok的特性来看:

  • 存储指针数组的malloc(0):strtok本身不生成新字符串,只是把原字符串里的分隔符改成'\0',返回原串中各段的指针。如果你的环境里malloc(0)返回了非空指针,哪怕这个空间大小为0,只要你后续往这个数组里写指针的操作没刚好踩到不可访问的内存(比如测试时分割的字符串段数很少,或者这个占位指针刚好落在可写内存区域),程序就会侥幸跑起来。但这本质是未定义行为,换个环境或测试用例大概率会崩。
  • 字符串本身的malloc(0):因为strtok直接操作原字符串,你这个malloc(0)分配的空间其实根本没被用到——它只是做了一个合法的内存申请(哪怕没空间),后续free它也不会报错,相当于一个“无意义但合法”的空操作,不会干扰程序运行。

为什么移除malloc就会报错?

移除malloc后,对应的指针会变成未初始化的野指针:

  • 如果是移除存储指针数组的malloc,你直接往野指针指向的随机地址写strtok返回的指针,大概率会踩到不可写的内存区域,直接触发段错误;
  • 如果是移除字符串的malloc,后续代码里可能有对这个指针的操作(比如free()),free一个未初始化的野指针会触发malloc的断言错误,或者访问这个野指针导致段错误。

关于strtok的补充

你猜的没错,strtok确实依赖原字符串的内存——它不会为分割出的子串分配新内存,只是修改原串的分隔符。所以你的split函数要正确工作,必须给存储子串指针的数组分配足够的空间(比如先统计分割次数,再分配对应大小的内存),而不是用malloc(0)凑数——现在的“正常运行”只是运气好,完全不可靠。

内容的提问来源于stack exchange,提问作者Sam van Kesteren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:33:16