char *s = "0123"和 char s[] = "0123"的区别

268 天前
 rookiemaster

为什么前者不可以修改,后者可以修改,是因为存储区域的问题吗?

3358 次点击
所在节点    C
22 条回复
wkla
267 天前
C++会提示"const char *" 类型的值不能用于初始化 "char *" 类型的实体。C 不会。
不过 C 会把这个字符串存只读段里,所以写的话会报段错误。

我说怎么怪怪的,越看越不对劲。只能说这套该扔就扔吧。
arloor
266 天前
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int a = 4; 栈,4 也是存在栈上
char s[] = "abc"; 栈 "abc"也是存在栈上
char *p2; 栈
char *p3 = "123456"; 123456\0 在常量区(是在 Data 段上),p3 在栈上。
static int c =0 ; 全局(静态)初始化为 0,就是放在 BSS 段
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
malloc 分配得来得 10 和 20 字节的区域就在堆区。因为属于动态申请分配内存空间
strcpy(p1, "123456"); 123456\0 放在常量区,编译器可能会将它与 p3 所指向的"123456"优化成一个地方。
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1028174

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX