去参加笔试了,有两道题做错了,都是印象里面有概念,但是没有弄清楚它到底是怎么回事,原理是什么,导致题目打错,现总结一下。
一、C++内存分配笔试考察
问题考察如下,请先不要看答案,看看你能否做对,呵呵:
怎么样,晕了没?正确答案及解析如下:
解析:char p[] = “...”是一个数组,这个数组是局部变量。char *p = “...”,是一个指针,这个指针指向一个字符串常量。区别在于:数组的话,字符串是存在这个数组里的,因为这个数组属于局部变量(存在栈区),而当该函数执行完,位于栈区的局部变量就销毁了,就算把数组的地址返回给主函数,主函数也无法访问到原有字符串了,应该输出乱码。但是,如果是指向字符串常量的指针,这个字符串是放在程序的常量区而不是放在局部变量中,那么把这个常量的地址返回给主函数,主函数也是可以访问它的。
下面就针对C++中的内存分配做个总结:
一个C/C++编译的程序占用的内存分为以下几个部分:
1. 栈区(stack)
由编译器自动分配释放,存放函数地址、函数参数值、局部变量的值等。
2. 堆区(heap)
就是那些由new分配的内存块,他们的分配与释放由程序员负责,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3. 全局/静态区(static)
全局变量和静态变量的存储是放在一块的,初始化的全局变量和初始化的静态变量在一块区域,为初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4. 常量存储区(const)
常量字符串就是放在这里的。
5. 程序代码区
存放函数体的二进制代码。
其中,堆栈的主要区别如下:
爽歪歪了吧,下面就来看第二个问题吧。。。
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
将C语言梳理一下,分布在以下10个章节中:
Linux-C成长之路(十):其他高级议题