gpt4 book ai didi

c - C中使用char*和char[]表示常量char数组的区别

转载 作者:行者123 更新时间:2023-12-04 12:13:06 28 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





why a "char*" can point to a "const char*"?

(1 个回答)


8年前关闭。




在 C 中创建常量字符串的好方法是什么?不能通过对其索引位置之一进行字符分配来改变的字符串。并且在初始化后的后续执行中不能被另一个字符串替换的字符串。

我在下面的代码中尝试了 char* 和 char[] 。我尝试使用和不使用“const”关键字。结果非常离奇。

以下是我的代码:

#include <stdio.h>
main() {
char a []= "abc" "def";
char* b = "abcdef";
const char c [] = "abcdef";
const char* d = "abcdef";

a[1] = 'y';
b[1] = 'y';
c[1] = 'y';
d[1] = 'y';
printf("%s %s %s %s \n", a, b, c, d);

a = "overwrited";
b = "overwrited";
c = "overwrited";
d = "overwrited";
printf("%s %s %s %s \n", a, b, c, d);
}

结果是
在第一个 printf 中,所有的 a、b、c、d 都可以变异;但是 c 和 d 出现“分配只读位置”的警告。
在第二个 printf 中, a 和 c 都返回错误。但是 b 和 d 被另一个字符串顺利替换并成为“覆盖”。

我对这个结果感到非常困惑,似乎“const”关键字对进行字符串分配没有影响;但它对索引字符突变有影响。而 char[] 和 char* 也表现出不同的行为。有人可以向我解释这背后的机制吗?

最佳答案

如果您想最大限度地提高您const 的机会数组将被放入实际的只读内存中,你应该让它们static还有:

static const char c[] = "abcdef";

这是因为所有具有自动存储期的变量通常都创建在相同的内存区域中,无论它们是否是 const - 合格与否。因此,该内存区域不能设为只读。

但是,鉴于您的实现显然也没有将字符串文字放入只读内存中,它可能根本不使用只读内存,并且警告可能是您所希望的最好的。如果你使用的是基于 gcc 的编译器,你也可以试试 -fno-writable-strings编译器选项。

这两行错误的原因:
a = "overwrited";
c = "overwrited";

是因为 ac是数组,数组不能直接赋值给 =运算符(无论它们是否为 const)。 =在变量声明中不是 =运算符 - 它只是初始化语法的一部分,数组可以被初始化。

这些行没问题的原因:
b = "overwrited";
d = "overwrited";

是因为 bd是指向常量 char 的非常量指针s。这些赋值不会改变 b 的原始字符串和 d指向 - 他们改变了 bd指向不同的字符串(实际上可能是相同的字符串)。

如果你想要 bd要成为常量指针(以便指针本身无法更改),您可以更改声明:
char * const b = "abcdef";
const char * const d = "abcdef";

..以及对 b 的分配和 d至少应该从编译器发出错误消息。

关于c - C中使用char*和char[]表示常量char数组的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18072582/

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