有谁能说说这两者的区别?

FFSB 2010-09-24 10:48:55
const char XX[] = {'r','i','o','\0'};
char *YY = "rio";
...全文
344 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
旭子 2010-09-25
  • 打赏
  • 举报
回复
一个经过了拷贝到栈区的操作 另一个没有
zyyjaf 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 adnim 的回复:]
如果是int *YY=10 呢?这个可以改变么?
[/Quote]
报错,把int 转 int*
adnim 2010-09-25
  • 打赏
  • 举报
回复
如果是int *YY=10 呢?这个可以改变么?
luoqi 2010-09-25
  • 打赏
  • 举报
回复
楼主来提这样的问题了,
这不是简单的区别,

同样一个东西,用在不同的地方,他的作用是不同的!
微笑明明 2010-09-25
  • 打赏
  • 举报
回复
这个很基础啊
queatin_man 2010-09-25
  • 打赏
  • 举报
回复
char *YY="test";是声明一个常量字符串,放到静态存储区的
we_sky2008 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 we_sky2008 的回复:]
如果两者都是定义为全局的:
语句const char XX[] = {'r', 'i', 'o', '\0'};
在编译时被分配空间并被用花括号里初始化值集初始化,
因被定义为const的,所以有可能编译器会是在只读的文字常量区为数组XX分配空间,
而语句char *YY = "rio";
在编译的时候先将字符串常量初始化在只读的文字常量区,并为指针变量YY分配空间并被初始化为指向字符串……
[/Quote]
刚才试了下,
const char XX[] = {'r','i','o','\0'};如果是定义为全局的数组
在VC中数组XX确实是被分配在了只读的文字常量区,如果修改数组的元素会引起运行时刻错误
如:
*(char *)XX = 'R';会引起运行时刻错误
we_sky2008 2010-09-25
  • 打赏
  • 举报
回复

如果两者都是定义为全局的:
语句const char XX[] = {'r', 'i', 'o', '\0'};
在编译时被分配空间并被用花括号里初始化值集初始化,
因被定义为const的,所以有可能编译器会是在只读的文字常量区为数组XX分配空间,
而语句char *YY = "rio";
在编译的时候先将字符串常量初始化在只读的文字常量区,并为指针变量YY分配空间并被初始化为指向字符串常量"rio"
而YY本身是在DATA段被分配空间的


如果两者都是被定义在函数栈上,则:
语句const char XX[] = {'r', 'i', 'o', '\0'};
数组XX被创建在栈上并在运行时被初始化,
而语句char *YY = "rio"; 在栈上为指针变量YY分配空间,仍将"rio"创建在只读的文字常量区,并将YY初始化为指向文字常量的字符串常量"rio"
tianya0609 2010-09-25
  • 打赏
  • 举报
回复
打酱油
赵4老师 2010-09-25
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
悅兎 2010-09-24
  • 打赏
  • 举报
回复
存储区域不同,读写权限不同
heminrui 2010-09-24
  • 打赏
  • 举报
回复
后者是存储在静态存储区,然后把指向该字符串常量的指针赋给指针YY,因此不能通过YY来改变某一个字符。而前面的是存储在栈里面。
Diza1986 2010-09-24
  • 打赏
  • 举报
回复
xuexi~~~~
lovestefanie 2010-09-24
  • 打赏
  • 举报
回复
后者是静态区。不能修改
iambic 2010-09-24
  • 打赏
  • 举报
回复
你的const更应该放在第二行……
FFSB 2010-09-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]

区别就是rio存放的是常量区,而XX里面的字符存放在栈区,这样他们的生命期就不一样了。"rio"生命期要长
[/Quote]
回炉去
doctor1190 2010-09-24
  • 打赏
  • 举报
回复
const char XX[] = {'r','i','o','\0'};
定义一个常量字符串存储在静态存储区

char *YY = "rio";
char *YY = "rio"; 相当于:const char *YY = "rio"; YY指向的是常量字符串存储在静态存储区

两个的数据都存储在静态存储区,只是一个是指针形式,一个是数组形式;
pengzhixi 2010-09-24
  • 打赏
  • 举报
回复
区别就是rio存放的是常量区,而XX里面的字符存放在栈区,这样他们的生命期就不一样了。"rio"生命期要长
liutengfeigo 2010-09-24
  • 打赏
  • 举报
回复
储存的位置不同。
justkk 2010-09-24
  • 打赏
  • 举报
回复
存储空间不同
XX虽然限定为const,但是也能通过其它方式强行修改
YY存储在只读区域
加载更多回复(7)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧