gpt4 book ai didi

c - 我应该如何定义/声明字符串常量

转载 作者:太空狗 更新时间:2023-10-29 16:29:34 27 4
gpt4 key购买 nike

我一直在 C 中使用字符串常量作为以下之一

char *filename = "foo.txt";
const char *s = "bar"; /* preferably this or the next one */
const char * const s3 = "baz":

但是,看完this ,现在我想知道,我是否应该将我的字符串常量声明为

const char s4[] = "bux";

?

请注意,建议为重复的链接问题是不同的,因为这个问题专门询问常量 字符串。我知道类型有何不同以及它们的存储方式。该问题中的数组版本 const 限定。这是一个简单的问题,关于我是否应该对常量字符串使用常量数组还是我一直在使用的指针版本。这里的答案已经回答了我的问题,当在 SO 和 Google 上搜索了两天没有得到确切的答案时。多亏了这些答案,我了解到当数组被标记为 const 时编译器可以做一些特殊的事情,并且确实有(至少一个)我现在将使用数组版本的情况。

最佳答案

指针和数组不同。将字符串常量定义为指针或数组适合不同的目的。

当您定义一个不可更改的全局字符串常量时,我​​建议您将其设为常量数组:

const char product_name[] = "The program version 3";

将其定义为 const char *product_name = "The program version 3"; 实际上定义了 2 个对象:字符串常量本身,它将驻留在常量段中,以及可以更改的指针指向另一个字符串或设置为 NULL

相反,将字符串常量定义为局部变量最好作为类型为 const char * 的局部指针变量,用字符串常量的地址初始化:

int main() {
const char *s1 = "world";
printf("Hello %s\n", s1);
return 0;
}

如果将其定义为数组,根据编译器和函数内部的用法,代码将在堆栈上为数组腾出空间,并通过将字符串常量复制到其中来初始化它,这是一个成本更高的操作字符串。

另请注意,const char const *s3 = "baz";const char *s3 = "baz"; 的冗余形式。它不同于 const char * const s3 = "baz";,它定义了一个指向常量字符数组的常量指针。

最后,字符串常量是不可变的,因此应该具有 const char [] 类型。 C 标准有意允许程序员将他们的地址存储到非 const 指针中,如 char *s2 = "hello"; 以避免对遗留代码产生警告。在新代码中,强烈建议始终使用 const char * 指针来操作字符串常量。当函数不更改字符串内容时,这可能会强制您将函数参数声明为 const char *。此过程称为constification 并避免微妙的错误。

请注意,某些函数违反了此const 传播:strchr() 不修改接收到的字符串,声明为const char *,但是返回一个 char *。因此,可以通过这种方式将指向字符串常量的指针存储到普通 char * 指针中:

char *p = strchr("Hello World\n", 'H');

这个问题在 C++ 中通过重载解决了。 C 程序员必须将此作为一个缺点来处理。一个更烦人的情况是 strtol(),其中传递了 char * 的地址,并且需要强制转换以保持适当的常量。

关于c - 我应该如何定义/声明字符串常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54975623/

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