C语言中 char ch[8] = "hello";求这条语句的执行原理?
有人说是复制常量区的hello的每个字符到这个字符数组里面,还有人说是ch这个数组的首地址直接指向了内存中“hello”这个字符串的首地址,没有经过复制。到底是怎么样的?...
有人说是 复制常量区的hello的每个字符到这个字符数组里面,还有人说是ch这个数组的首地址直接指向了内存中“hello”这个字符串的首地址,没有经过复制。
到底是怎么样的?我比较倾向于第二种解释,因为如果是第一种的话,那相当于多调用了一次字符串拷贝函数,而且拷贝之后,以前字符串的那段内存区域没有指针指向,岂不是永远释放不了了,求指定,不胜感激 展开
到底是怎么样的?我比较倾向于第二种解释,因为如果是第一种的话,那相当于多调用了一次字符串拷贝函数,而且拷贝之后,以前字符串的那段内存区域没有指针指向,岂不是永远释放不了了,求指定,不胜感激 展开
展开全部
正常答案是第一种。
原因其实很简单的,当然需要两份空间了,ch只是栈上的变量,每次进入其所有作用域时都需要初始化其内容的,所以必须在常量区里面存储一份,不然后面ch的进行修改后可怎么办?
原因其实很简单的,当然需要两份空间了,ch只是栈上的变量,每次进入其所有作用域时都需要初始化其内容的,所以必须在常量区里面存储一份,不然后面ch的进行修改后可怎么办?
追问
感觉您说的很对,我还有一个问题:为什么必须在常量区里存储一份?难道每一个栈上面的数组都在常量区存储一份吗
追答
这是内存管理的概念了。栈上的内容当函数退出后就没有了(俗称栈回退),下次进入函数时又会重新初始化栈,像字符串这样的东西,必须要有地方存储初始化的值的,C++的做法就是在常量区存储。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
堆内存才会有释放问题,栈内存自动释放,用完随即释放
变量从没有到创建内存并赋值,肯定存在拷贝的过程,不是你理解的strcat就是了
说白了就是先创建一个8bit的空间,然后写数据,完成后写入$,并返回首地址和偏移量
变量从没有到创建内存并赋值,肯定存在拷贝的过程,不是你理解的strcat就是了
说白了就是先创建一个8bit的空间,然后写数据,完成后写入$,并返回首地址和偏移量
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实只要能理解,两种说法都行。当然第二种确实说的比较完整点。因为这个是一个hello字符串,有一个结束标示符也占一个字节,第一种说法只是说ch是一个数组,一个个字符的复制,也不是不行,只是少了字符串这个概念。
追问
第一种是需要开辟两份空间,一份是 字符串hello的空间,另一份是复制字符串的目的地ch数组的空间。
第二种只需要一份空间,就是字符串空间,然后领ch直接指向这个字符串。
那到底是开辟一份空间还是开偏两份空间呢?
追答
老实说,我认为只要ch这个数组的一个空间就可以了,字符串只是为了给ch赋值而写的一种形式。ch【】是一个数组变量,本身就具有保存变量的功能,用堆栈理解,一个字--怪
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得可以用第二种方法解释,因为字符串常量存放在静态存储区,数组的名字代表了该数组的首地址,可以认为是把字符串的首地址赋值给了数组的首地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ch本来就是"hello"存放的首地址啊 何来多种解释?
如果第一种解释 请问怎么找到"hello"这个字符串?既然找不到又何来复制到ch[] 如果能找到能复制,又何来释放不了呢??
如果第一种解释 请问怎么找到"hello"这个字符串?既然找不到又何来复制到ch[] 如果能找到能复制,又何来释放不了呢??
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询