michael-burr关于这个问题的答案:
what-is-the-type-of-string-literals-in-c-and-c
我发现
在C语言中,字符串文字的类型为char []-根据类型不是const,但是修改内容是不确定的行为
据此我可以认为句子"How are you"
不能被修改(就像char c*="how are you?"
一样),但是一旦它被用来初始化一些char[]
,那么除非声明为{ {1}}。
除了该答案之外,
然后使用多字节字符序列初始化静态存储持续时间数组
以及 C Primer Plus 6th Edition 的发现:
字符字符串常量放置在静态存储类中,这意味着如果您使用 函数中的字符串常量,该字符串仅存储一次,并在 程序,即使该函数被多次调用
但是当我尝试这段代码时:
const
函数 #include <stdio.h>
void fun() {
char c[] = "hello";
printf("%s\n", c);
c[2] = 'x';
}
int main(void) {
fun();
fun();
return 0;
}
中的数组的行为并不像它保留了更改后的值。
我在哪里出错了?
答案 0 :(得分:3)
char c[]="hello";
与char *c="hello";
完全不同。后者初始化指向上述静态字符串存储的指针,修改c[2]
将是未定义的行为。前者等效于:
char c[] = {'h', 'e', 'l', 'l', 'o', '\0'};
它正在初始化堆栈上的数组,没有在其他内存位置创建对静态字符串的引用或指针。像其他任何非const
堆栈数组一样,您可以根据需要进行修改(只要不超出范围即可)。
答案 1 :(得分:2)
因为它是一个自动变量,并且每次调用该函数时都会对其实例进行初始化。
将其更改为具有静态存储空间
static char c[]="hello";
它将按照您期望的那样在函数调用之间保持更改的值
这与字符串文字和复合文字在变量初始化中的存储和使用方式完全不同。剩下的就是实现-例如,自动存储变量的初始化可以通过复制.rodata段中的数据来完成,也可以只是直接存储指令对,而文字将存储在.text段中。
答案 2 :(得分:2)
您没有修改字符串文字。您正在修改包含字符串文字副本的本地数组。每次调用fun
时,都会创建并初始化c
的新实例。当fun
退出时,c
的该实例不再存在。