【问题标题】:Why does char* cause undefined behaviour while char[] doesn't?为什么 char* 会导致未定义的行为,而 char[] 不会?
【发布时间】:2012-01-08 07:01:27
【问题描述】:

尝试修改字符串文字会导致未定义的行为:

char * p = "wikipedia"; 
p[0] = 'W'; // undefined behaviour

防止这种情况的一种方法是将其定义为数组而不是指针:

char p[] = "wikipedia"; 
p[0] = 'W'; // ok

为什么char* 会导致未定义的行为,而char[] 不会?

【问题讨论】:

  • 这是一个问题,还是您在发表评论?
  • 问题在 ... 问题中 :-) 我同意这有点粗制滥造,但是嘿...
  • 我已投票决定重新打开它。问题在标题中。我已经对其进行了编辑,因此实际问题在正文中。 (不过,它很可能是重复的。)

标签: c string char undefined-behavior


【解决方案1】:

任何修改 C 字符串文字的尝试都有未定义的行为。编译器可能会安排将字符串文字存储在只读内存中(受操作系统保护,而不是真正的 ROM,除非您在嵌入式系统上)。但是语言不需要这个;作为一名程序员,这取决于您是否正确。

一个足够聪明的编译器可能会警告您,您应该将指针声明为:

const char * p = "wikimedia";

虽然没有const 的声明在C 中是合法的(为了不破坏旧代码)。但不管有没有编译器警告,const 都是一个非常好的主意。

(在 C++ 中,规则不同;C++ 字符串文字,与 C 字符串文字不同,实际上是 const。)

当您使用文字初始化数组时,文字本身仍然存在于程序映像的潜在只读区域中,但它被复制到本地数组中:

char s[] = "wikimedia"; /* initializes the array with the bytes from the string */
char t[] = { 'w', 'i', ... 'a', 0 };  /* same thing */

请注意,char u[] = *p起作用——数组只能从大括号初始化器初始化,而字符数组还可以从字符串文字初始化。

【讨论】:

  • 任何自尊的程序员都会考虑 const 正确性 ;) ... +1
  • 问题被标记为C。在C 中,"foo" 的类型是 char 数组。我看不出编译器应该在什么基础上警告您应该将指针声明为 ...
  • @Complicatedseebio:基于您不允许改变内容:-)(这就是 warnings 的用途。)
  • +1 对于像我这样的 C++ 新手非常有帮助。我永远不会知道我最好在 char* 之前使用 const 否则。谢谢。
  • 不过,您可以将“foo”分配给char * 变量。任何警告都会非常不受欢迎。
猜你喜欢
  • 1970-01-01
  • 2015-09-06
  • 2021-09-01
  • 2011-02-23
  • 2010-11-28
  • 2014-10-10
  • 2021-02-10
  • 2017-03-12
  • 2013-08-22
相关资源
最近更新 更多