两种char指针初始化方式是否等价?若不等价有何差异?
两种char指针初始化方式的等价性判断
这两种初始化方式不等价,核心差异体现在以下几个方面:
1. 存储区域与可修改性
方式一:
char *str = "String!";
这里的"String!"是字符串常量,存储在程序的只读数据段(如.rodata)。虽然用char*指针指向它,但尝试修改指针指向的内容(比如str[0] = 's';)会触发未定义行为(可能导致程序崩溃、异常等)。方式二:
char *str = (char []){"String!"};
这里的(char []){"String!"}是C语言的复合字面量,会创建一个自动存储期的字符数组(通常在栈上)。这个数组是可修改的,执行str[0] = 's';是完全合法的操作,不会引发未定义行为。
2. 存储期(生命周期)
- 方式一中的字符串常量属于静态存储期,从程序启动到结束一直存在,指针
str始终指向有效的内存区域(只要程序在运行)。 - 方式二中的复合字面量如果定义在函数内部,属于自动存储期:当所在的代码块(比如函数)执行完毕后,这个字符数组会被销毁,此时
str就变成了悬空指针,后续访问会触发未定义行为。
内容的提问来源于stack exchange,提问作者stanchcorder6
相关产品推荐
相关产品推荐

