C 中的 char* 与 const char*

char* vs const char* in C

char* str ="Hello";

在上面的代码中,文字 "Hello" 存储在 ... DATA 段中,并且它是只读的。 所以总是声明它不是更好吗:

const char* str = "Hello";

避免不正确的代码,例如:

*(str+1) = 't';

"Hello" is stored ... in the DATA segment

"DATA" 或 .data 将引用具有静态存储持续时间的初始化 read/write 变量所在的段。字符串文字不存储在那里,但更有可能存储在称为 .rodata 的东西中,或者可能与代码一起存储在 .text 中。 参见 String literals: Where do they go?

So isn't it better to always declare it: const char* str = "Hello";

是的,您应该始终 const 限定指向字符串文字的指针。这是 C 中普遍认为的最佳实践(在 C++ 中是强制性的)。

是的,最好将指向字符串文字的指针声明为const char *。 "literal" 这个名字非常强烈地表明这是不可变的东西。不幸的是,C 将字符串文字视为 char 而非 const char 的数组,并且与数字文字不同,字符串文字的存储必须从某处分配。不能保证此存储将从 .rodata 之类的只读段中获取 - 我过去曾使用过可写字符串文字的实现。

尝试修改字符串文字内容的行为是未定义 - 该语言不要求编译器或运行时环境以任何特定方式处理这种情况.您 可能 遇到运行时错误,或者字符串 可能 保持不变,或者字符串 可能 修改后,任何完全不同的事情都可能发生。

因此,通过将指针声明为 const char *,您至少可以更难 意外地 通过该指针修改文字。请记住 const 并不 表示 "put this thing in read-only memory" - 它仅表示 "issue a diagnostic if someone tries to modify this thing"。