更改常量字符串(C99)[重复]

Posted

技术标签:

【中文标题】更改常量字符串(C99)[重复]【英文标题】:Changing constant strings(C99) [duplicate] 【发布时间】:2014-02-16 09:21:29 【问题描述】:

我有 2 个关于该代码的问题:

char* word="Hello World";
word[0]='a';
printf("%s",word);

我知道当你创建这样的字符串时,你不能改变字符串,因为它是一个常量字符串,所以我不明白为什么我可以运行这段代码并且没有任何错误(我使用代码块C99)?另一个奇怪的事情是这个词并没有真正改变,printf 仍然打印:“Hello World”。

【问题讨论】:

检测未定义的行为通常是无法确定的(并且 C 标准不要求编译器在出现错误时发出警告或产生错误)。不过,编译器可以检测到这种情况是对的。 【参考方案1】:

当您尝试修改字符串文字时,它会调用 未定义的行为。结果可能是预期的或意外的。它要么打印Hello Worldaello World,要么什么也不打印。您可能会遇到分段错误或任何意外行为。

【讨论】:

"... 使用 -Wextra 标志编译您的代码,然后您的编译器会抛出错误。" gcc (Debian 4.4.5-8) 4.4.5 不会. @alk: ideone.com/hkKD7n @hacks:如何让这个应用程序向我显示编译器警告? 查看运行时错误。删除了有争议的行。【参考方案2】:

获取错误声明为

const char * word="hello world";

在您的情况下,它可能会在运行时崩溃,因为 hello world 存储在只读内存中。

一般

const char *char * 几乎相同,但不同之处在于,如果您尝试编辑字符串,则const char * 在编译时显示错误,而char * 在运行时显示错误。

【讨论】:

以上是关于更改常量字符串(C99)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C99 常量值传递

c 语言学习第二天

摆脱 Julia 的“警告:为未更改的字符串重新定义常量”?

C ++ - 从字符串常量到'char *'的不推荐转换[重复]

常量前加字符('+')[重复]

指向字符串常量的指针[重复]