首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用strtok()时,为什么在这里修改常量char数组

当使用strtok()时,为什么在这里修改常量char数组
EN

Stack Overflow用户
提问于 2021-09-07 18:06:28
回答 4查看 104关注 0票数 0
代码语言:javascript
运行
复制
#include <stdio.h>

int main() {
    const char a[99]="hello-hi";
    printf("%s\n",a);
    char *p=strtok(a,"-");
    printf("%s",a);
    return 0;
}

产出:

代码语言:javascript
运行
复制
hello-hi
hello

为什么在这里修改a??我做得很好,但为什么要修改呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-09-07 18:11:23

  1. const char数组不必位于只读内存中.试图修改它是一种未定义的行为。任何事情都可能发生分段故障、修改、病毒激活、银行账户转移、磁盘擦除等。

warnings

  1. 读取编译器

代码语言:javascript
运行
复制
<source>:9:20: warning: passing 'const char [99]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]
    char *p=strtok(a,"-");

  1. int main()应该是int main(void)
票数 2
EN

Stack Overflow用户

发布于 2021-09-07 18:29:21

const的定义不是“计算机将阻止您修改对象”。C 2018 6.7.3 7中const的定义是:

如果试图通过使用具有非const限定类型的lvalue来修改使用const限定类型定义的对象,则该行为是未定义的…。

因此,使用const定义对象并不会从计算机中创建不修改对象的承诺。这实际上是另一个方向上的承诺:这是你对计算机的承诺,你不会试图修改对象。这使编译器可以将对象放入标记为只读的内存中.

如果您违背了承诺,则该行为不受C标准的定义。对象可能在只读内存中,试图修改它将导致陷阱,并提醒您注意程序中的错误。或者对象可能在可修改的内存中,试图修改它将修改它。或者,通过程序优化,可能会发生其他行为。

C标准确实在这方面给了你一些帮助。当您将一个const char *传递给strtok (它需要一个char * )时,编译器需要发出一个诊断消息。注意编译器报告的警告和错误,并使用它们来修复程序。更可取的做法是,使用编译器开关将警告提升为错误。(-Werror与GCC或Clang,/WX与Microsoft C++.)

票数 3
EN

Stack Overflow用户

发布于 2021-09-07 18:11:28

,为什么在这里修改a??

strtok修改字符串。修改const对象会导致未定义的行为。示例程序的行为未定义。

实际上,const数组不会转换为指向非const的指针(没有强制转换),因此程序的格式不正确。

其他问题:

不包括声明strtok.

  • int main()在C.

中不符合标准的标题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69092765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档