C 什么';这5种声明/初始化常量限定指针的方法有哪些错误?(摘自一本可疑但受欢迎的书)

C 什么';这5种声明/初始化常量限定指针的方法有哪些错误?(摘自一本可疑但受欢迎的书),c,pointers,constants,qualifiers,C,Pointers,Constants,Qualifiers,我的错!!我以为下面这段摘自一本臭名昭著但却广受欢迎的书的摘录是完全正确的C。但直到今天,我才被指出它充满了UB(尽管我还不知道它是怎么回事)。因此,这是这本书中的特定部分。你将对我和其他许多“受害者”进行惩罚像我一样,如果你能用编号的方式指出每一个特定陈述的错误或错误,以及对这些错误或错误的适当更正,我将不胜感激 char *p = "Hello" ; /* pointer is variable, so is string */ *p = 'M' ; /* works */ p =

我的错!!我以为下面这段摘自一本臭名昭著但却广受欢迎的书的摘录是完全正确的C。但直到今天,我才被指出它充满了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 */ 
“Hello”是一个字符串文本,放在实现只读内存中,以任何可能的方式修改它都是一个UB。无论将
常量
限定符放在何处,任何修改字符串文字的尝试都是错误的。在C++中正确表达这一点的方法是:

const char *p = "Hello";

可以重置指针,但不应修改字符串

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

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

const char *q = "Hello" ;
char const *s = "Hello" ;
char * const t = "Hello" ;
const char * const u = "Hello" ;
无法重置指针,不应修改字符串

const char *q = "Hello" ;
char const *s = "Hello" ;
char * const t = "Hello" ;
const char * const u = "Hello" ;
指针是常量,字符串也是常量


任何试图修改其中任何一个字符串的行为都是UB。

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

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.

char*p
应指向非常量字符串。字符串文字是常量。上面的
q
s
案例是相同的
const-char*
char-const*
是同一种类型。@请帮我一个忙&其他像我这样的人。花点时间发布详细的答案。上面唯一的问题是当你试图写入字符串文字时(cases
p
t
)。这已经解释了数百次了。所有其他的情况都有正确的地方(或更多),所以编译器会警告你。因为问题是标记C,而不是标记C++,这个答案不应该描述C中的情况,而不是C++中的正确吗?(传统的答案是C和C++对于C++的C子集几乎是相同的。如果它们是相同的,那么就可以解释C.的情况,这个特殊问题涉及字符串和字符,它们都在C和C++中有不同的类型)。@PascalCuoq我将要把Alok说的话反复灌输到我的脑海中。如果你觉得他说的话对C来说有什么不同,你能把它写进一个答案吗?