0

我的错!我曾假设以下来自一本臭名昭著但广受欢迎的书的摘录是完全有效的 C。但直到今天我才被指出它与 UB 一起使用(尽管我还没有找到它是怎么回事)。因此这里是书中的那个特定部分。如果您能以编号的方式指出每个特定陈述的错误或 UB,以及对这些陈述的适当更正,您将对我和许多其他像我一样的“受害者”大有帮助。

char *p = "Hello" ;  /* pointer is variable, so is string */ 
*p = 'M' ;  /* works */ 
p = "Bye" ;  /* works */ 


const char *q = "Hello" ;  /* string is fixed pointer is not */ 
*q = 'M' ;  /* error */ 
q = "Bye" ;  /* works */ 


char const *s = "Hello" ;  /* string is fixed pointer is not */ 
*s = 'M' ;  /* error */ 
s = "Bye" ;  /* works */ 


char * const t = "Hello" ;  /* pointer is fixed string is not */ 
*t = 'M' ;  /* works */    
t = "Bye" ;  /* error */ 


const char * const u = "Hello" ;  /* string is fixed so is pointer */ 
*u = 'M' ;  /* error */ 
u = "Bye" ;  /* error */ 
4

2 回答 2

1
char *p = "Hello"

“Hello”是放置在实现只读内存中的字符串文字,以任何可能的方式修改它是一个UB。无论您将const限定符放在哪里,任何修改字符串文字的尝试都是 UB。在 C++ 中表示它的正确方法是:

const char *p = "Hello";

char *p = "Hello" ;

可以重新定位指针,但不应修改字符串。

const char *q = "Hello" ;
char const *s = "Hello" ;

在 C++ 中表示指向字符串文字的指针的正确方法。可以重新定位指针,但不应修改字符串。

char * const t = "Hello" ;

指针不能被重新定位,字符串也不能被修改。

const char * const u = "Hello" ;

指针是常量,字符串也是。

任何修改这些字符串的尝试都是 UB。

于 2013-04-28T18:28:13.700 回答
1

这两种情况是未定义的行为:

char *p = "Hello" ;
*p = 'M' ;  // Undefined behavior: trying to modify a string literal.


char * const t = "Hello" ;
*t = 'M' ;  // Undefined behavior: trying to modify a string literal.
于 2013-04-28T18:33:15.537 回答