编译原理练习
1.栈内存和堆内存空间有哪些区别?

2.程序的局部变量,全局变量,静态变量,字符串,动态申请的数据都存放在哪个区域?
- 局部变量存放于栈区
- 全局区中存放着全局变量和静态变量
- 字符串存放于常量区
- 动态申请存放于堆区中

3.编译阶段和链接阶段各自完成了那些工作?
- 编译阶段:汇编和只编译;检查分析源代码的语法单元,检查代码的有效性,检查成功产生机器码符号等
- 链接阶段:解析外部变量和函数引用找到符号连接数据库文件生成可执行文件
4.什么是野指针?什么是内存泄漏
- 野指针是指向无效内存或者已被释放的内存的指针
- 内存泄漏并非指内存物理消失,而是程序在申请内存后未能正确释放,导致该部分内存无法再被使用,长期累积将占用大量系统资源,最终影响程序甚至系统的稳定性。
5.realloc和malloc功能上有什么区别?
- malloc() 函数分配的内存空间位于堆中,而不是栈中。因此,在使用完这块内存之后,一定要将其释放掉
- malloc() 函数成功分配内存空间后会返回一个指针,因为分配的是一个 int 型空间,所以返回指针时也应该使用对应的 int 型指针,这样就要进行强制类型转换。最后将函数返回的指针赋值给指针 pInt,就可以保存动态分配的整型空间地址了。
- calloc() 函数会返回一个指针,该指针指向动态分配的连续内存空间的首地址。当空间分配错误时,返回 NULL。
- calloc() 函数的功能是在内存中动态分配 n 个长度为 size 的连续内存空间.