C语言中 char ch[8] = "hello";求这条语句的执行原理?

有人说是复制常量区的hello的每个字符到这个字符数组里面,还有人说是ch这个数组的首地址直接指向了内存中“hello”这个字符串的首地址,没有经过复制。到底是怎么样的?... 有人说是 复制常量区的hello的每个字符到这个字符数组里面,还有人说是ch这个数组的首地址直接指向了内存中“hello”这个字符串的首地址,没有经过复制。
到底是怎么样的?我比较倾向于第二种解释,因为如果是第一种的话,那相当于多调用了一次字符串拷贝函数,而且拷贝之后,以前字符串的那段内存区域没有指针指向,岂不是永远释放不了了,求指定,不胜感激
展开
 我来答
beddy1
2013-03-14 · TA获得超过1988个赞
知道大有可为答主
回答量:2271
采纳率:0%
帮助的人:2192万
展开全部
正常答案是第一种。
原因其实很简单的,当然需要两份空间了,ch只是栈上的变量,每次进入其所有作用域时都需要初始化其内容的,所以必须在常量区里面存储一份,不然后面ch的进行修改后可怎么办?
追问
感觉您说的很对,我还有一个问题:为什么必须在常量区里存储一份?难道每一个栈上面的数组都在常量区存储一份吗
追答
这是内存管理的概念了。栈上的内容当函数退出后就没有了(俗称栈回退),下次进入函数时又会重新初始化栈,像字符串这样的东西,必须要有地方存储初始化的值的,C++的做法就是在常量区存储。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
推荐于2017-12-08 · TA获得超过463个赞
知道小有建树答主
回答量:598
采纳率:65%
帮助的人:278万
展开全部
堆内存才会有释放问题,栈内存自动释放,用完随即释放
变量从没有到创建内存并赋值,肯定存在拷贝的过程,不是你理解的strcat就是了
说白了就是先创建一个8bit的空间,然后写数据,完成后写入$,并返回首地址和偏移量
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sqiuzhao
2013-03-14 · TA获得超过1347个赞
知道小有建树答主
回答量:967
采纳率:0%
帮助的人:419万
展开全部
其实只要能理解,两种说法都行。当然第二种确实说的比较完整点。因为这个是一个hello字符串,有一个结束标示符也占一个字节,第一种说法只是说ch是一个数组,一个个字符的复制,也不是不行,只是少了字符串这个概念。
追问
第一种是需要开辟两份空间,一份是 字符串hello的空间,另一份是复制字符串的目的地ch数组的空间。
第二种只需要一份空间,就是字符串空间,然后领ch直接指向这个字符串。

那到底是开辟一份空间还是开偏两份空间呢?
追答
老实说,我认为只要ch这个数组的一个空间就可以了,字符串只是为了给ch赋值而写的一种形式。ch【】是一个数组变量,本身就具有保存变量的功能,用堆栈理解,一个字--怪
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
I_lovetennis
2013-03-14 · 超过19用户采纳过TA的回答
知道答主
回答量:58
采纳率:100%
帮助的人:31.5万
展开全部
我觉得可以用第二种方法解释,因为字符串常量存放在静态存储区,数组的名字代表了该数组的首地址,可以认为是把字符串的首地址赋值给了数组的首地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cqpcy
2013-03-14 · TA获得超过658个赞
知道小有建树答主
回答量:746
采纳率:66%
帮助的人:360万
展开全部
ch本来就是"hello"存放的首地址啊 何来多种解释?
如果第一种解释 请问怎么找到"hello"这个字符串?既然找不到又何来复制到ch[] 如果能找到能复制,又何来释放不了呢??
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式