预备知识:
1)c程序的私有内存空间,大致有栈区、堆区、代码区、静态区。而静态区中.data数据段,.bss段,.rdata只读数据段。
2)字符串常量其实是const修饰的变量(以下简称const变量),而不是通俗意义上的常量。
(const变量与常量的区别就是,const变量存储在内存中静态区只读数据段。而常量没有存储在内存中,而是直接写在代码上。)
(上面可能是错的)
如图,尝试访问只读数据段时,产生地址非法中断。
猜测过程:
执行char b[]="hello"时,把"hello"对应得anscii码值从只读数据段复制到栈区(因为b是局部变量,局部变量是存储在栈区的。),然后释放const常量"hello"的空间。
等到该函数执行完毕,释放b指向的空间。
char b[]中b的实质其实是指针变量,b这个指针变量一定是存放在栈中的,那b指向的内容是不是存放在栈中呢。应该是的,因为声明char b[]时,中括号里可以写一个常量指明字符数组的大小,这个数值写的很大时,运行时就会有栈溢出错误。
疑问:
2)执行char b[]="hello"后,"hello"中的字符一个一个的赋给b[],在这之后const变量"hello"的空间会被释放吗?
3)如果执行char *p=“hello”; 那么"hello"的首地址就会被赋给p,显然"hello"的空间不会被释放。那么"hello"的空间什么时候被释放呢?是等p所在函数执行完(假设p是局部变量)呢?还是等程序执行完后呢?
看到了一篇博客,解释了我大部分疑问:
https://blog.csdn.net/mcu_tian/article/details/37910835
大致内容如下:字符串常量的生命周期贯穿整个程序,在程序中不同地方使用内容相同的字符串常量时,使用的其实是同一个字符串常量(在内存中的地址相同)。
新的疑问:const a=1,这种变量与字符串常量的本质一样吗,存储在内存中的相同区域吗?
在网上看到了个视频,也解释了我的部分疑问,如下。
(以下内容参考周哥教it:c语言深学活用)