gpt4 book ai didi

c - 这 5 种无数种声明/初始化常量限定指针的方法有什么问题?(摘自一本可疑但受欢迎的书)

转载 作者:太空宇宙 更新时间:2023-11-04 08:57:27 25 4
gpt4 key购买 nike

我的错!!我曾假设以下摘自一本臭名昭著但广受欢迎的书的摘录是完全有效的 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 */

最佳答案

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。

关于c - 这 5 种无数种声明/初始化常量限定指针的方法有什么问题?(摘自一本可疑但受欢迎的书),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16266204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com