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

为什么声明为const的char数组在使用strtok()时会被修改

#include <stdio.h>
// 原代码缺失strtok依赖的头文件,补充如下
#include <string.h>
int main() {
    const char a[99]="hello-hi";
    printf("%s\n",a);
    char *p=strtok(a,"-");
    printf("%s",a);
    return 0;
}
问题原因解答
  • C语言中的const关键字仅提供编译期的语法检查约束,不代表对应内存区域具备运行期的不可写属性。你声明的const char a[99]分配在栈内存空间,栈内存本身是可读可写的,const只是要求编译器在编译阶段阻止代码显式修改a的内容,不会从硬件层面禁止对这块内存的写入操作。
  • 标准库函数strtok的第一个形参类型是char *而非const char *,你将const char类型的数组名传入strtok时,相当于隐式丢弃了const修饰符,这一步编译器会抛出警告(开启编译告警选项如-Wall就能看到),等于你主动绕过了编译器的const检查。
  • strtok的实现逻辑本身就会修改传入的原字符串:它会将找到的第一个分隔符位置的字符替换为\0,你代码里就是把原字符串中的-替换成了结束符,所以第二次打印a的时候只会输出到\0为止,结果就是hello。
  • 额外补充:你的代码未引入<string.h>头文件就调用strtok,属于隐式声明函数的不符合规范写法,也会带来额外的编译隐患。

注意:修改被const限定的对象属于C标准定义的未定义行为,你现在的运行结果只是特定编译器、特定运行环境下的表现,不具备通用性。如果你的字符串是定义在只读数据段的常量字符串(例如const char *a = "hello-hi";),调用strtok修改时会直接触发段错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:15:02