You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两种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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:11:25