更改常量字符串(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 World
或aello 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)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
摆脱 Julia 的“警告:为未更改的字符串重新定义常量”?