You need to enable JavaScript to run this app. 为什么strtok函数传入char*类型字符串参数会触发段错误?
优惠活动
大模型
产品
解决方案
定价
更多

为什么strtok函数传入char*类型字符串参数会触发段错误?

问题核心原因

段错误触发的本质是strtok尝试写入只读内存区域,和char*、char[]两种定义的内存属性、strtok的实现逻辑直接相关:

1. 两种字符串定义的本质区别

  • char *string = "Hello world whats up?"定义的是指向字符串字面量的指针:C标准规定字符串字面量属于只读常量,存储在进程的只读数据段(.rodata),操作系统会禁止程序修改这块内存区域,任何写入操作都会触发段错误。此时string指针本身是可修改的,但它指向的内存内容不可修改。
  • char string[] = "Hello world whats up?"定义的是字符数组:程序会在可写内存区域(全局变量存在数据段,局部变量存在栈)开辟对应长度的空间,将字符串字面量的内容拷贝到这块空间中,这块内存的内容是允许修改的。

2. strtok的底层实现逻辑

strtok的功能是分割字符串,内部实现会直接修改传入的原字符串:它会把找到的分隔符位置替换为\0,以此把长字符串切割为多个独立的子串。你可以从它的函数声明char *strtok (char *__restrict __s, const char *__restrict __delim)看出,第一个参数是char*而非const char*,就是明确告知调用者,该函数会修改传入指针指向的内存内容。
你传入指向只读字符串字面量的指针时,strtok内部执行写入操作直接违反了内存读写权限,就会触发段错误;换成字符数组后,传入的是可写内存的首地址,写入操作合法,程序就能正常运行。

扩展注意事项

所有参数为非const char指针的字符串处理函数(比如strcat、strcpy、strupr等),都存在修改传入内存的可能,调用这类函数时不要直接传入字符串字面量,否则大概率会触发段错误。


内容的提问来源于stack exchange,提问作者Matthew Schmidt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 04:06:04