C 字符串文字是否为常量?

C 字符串文字是否为常量?,c,c-strings,arrays,C,C Strings,Arrays,可能重复: 这像一个常量指针吗?当我试图通过写入s[3]='k'来更改位置3中的字符时,它给了我一个分段错误。所以我假设它就像指向一个常量数组,或者s是一个常量指针?两个人中哪一个?请澄清。没错,您不允许修改字符串文字 但是,这样做是合法的: char s[] = "anusha"; s[3] = 'k' 这里的区别在于它存储为可修改的本地数组。没错,不允许修改字符串文字 但是,这样做是合法的: char s[] = "anusha"; s[3] = 'k' 这里的区别在于它存储为一个可以

可能重复:


这像一个常量指针吗?当我试图通过写入
s[3]='k'
来更改位置3中的字符时,它给了我一个分段错误。所以我假设它就像指向一个常量数组,或者s是一个常量指针?两个人中哪一个?请澄清。

没错,您不允许修改字符串文字

但是,这样做是合法的:

char s[] = "anusha";
s[3] = 'k'

这里的区别在于它存储为可修改的本地数组。

没错,不允许修改字符串文字

但是,这样做是合法的:

char s[] = "anusha";
s[3] = 'k'

这里的区别在于它存储为一个可以修改的本地数组。

看起来编译器将
“anusha”
视为指向
字符的指针,但将字符串本身放入写保护内存中。我记得我读到过,这是一项便利政策,以符合现行规范


正如Joe指出的,这在中有详细说明。

看起来编译器将
“anusha”
视为指向
字符的指针,但将字符串本身放入写保护内存中。我记得我读到过,这是一项便利政策,以符合现行规范


正如Joe指出的,这一点在中有详细说明。

这里有一个实际原因:任何时候“anusha”以文本形式出现,编译器都可以使用相同的地址。“如果允许更改,这将是无效的。”迈克尔,正如我在另一篇类似的帖子中读到的。。。。。。如果我说char*s=“anusha”;和printf(“anusha”);在代码后面的某个地方,编译器在两个语句中使用相同的字符串文本地址?这是否意味着它会检查这样一个字符串文本是否已经存在?这是写保护它的原因,但不是让它成为
char*
而不是
const char*
。啊,我明白你现在说的了。我不知道。有趣的是,显然在C中,它是char [],(不是char),而C++中的类型是conchchar *。使用char[]而不是char*的原因是sizeof将以这种方式提供字符串的大小。下面是一个实际原因:任何时候“anusha”显示为文本,编译器都可以使用相同的地址。“如果允许更改,这将是无效的。”迈克尔,正如我在另一篇类似的帖子中读到的。。。。。。如果我说char*s=“anusha”;和printf(“anusha”);在代码后面的某个地方,编译器在两个语句中使用相同的字符串文本地址?这是否意味着它会检查这样一个字符串文本是否已经存在?这是写保护它的原因,但不是让它成为
char*
而不是
const char*
。啊,我明白你现在说的了。我不知道。有趣的是,显然在C中,它是char [],(不是char),而C++中的类型是conchchar *。使用char[]而不是char*的原因是sizeof将以这种方式提供字符串的大小。谢谢。但它是常量数组还是常量指针?两者都不是?在您的示例中,指针不是常量,但仍然不允许修改它。在我回答的示例中,它与任何本地声明的数组相同。数组的形式类型是
char[]
(no
const
),但尝试修改它会导致未定义的行为。谢谢。但它是常量数组还是常量指针?两者都不是?在您的示例中,指针不是常量,但仍然不允许修改它。在我回答的示例中,它与任何本地声明的数组相同。数组的形式类型是
char[]
(no
const
),但尝试修改它会导致未定义的行为。