#include <stdio.h>
int main() {
const char a[99]="hello-hi";
printf("%s\n",a);
char *p=strtok(a,"-");
printf("%s",a);
return 0;
}产出:
hello-hi
hello为什么在这里修改a??我做得很好,但为什么要修改呢?
发布于 2021-09-07 18:11:23
const char数组不必位于只读内存中.试图修改它是一种未定义的行为。任何事情都可能发生分段故障、修改、病毒激活、银行账户转移、磁盘擦除等。warnings
<source>:9:20: warning: passing 'const char [99]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]
char *p=strtok(a,"-");int main()应该是int main(void)发布于 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++.)
发布于 2021-09-07 18:11:28
,为什么在这里修改a??
strtok修改字符串。修改const对象会导致未定义的行为。示例程序的行为未定义。
实际上,const数组不会转换为指向非const的指针(没有强制转换),因此程序的格式不正确。
其他问题:
不包括声明strtok.
int main()在C.中不符合标准的标题。
https://stackoverflow.com/questions/69092765
复制相似问题