编译原理练习

13 阅读2分钟

1.栈内存和堆内存空间有哪些区别?

  • 1.堆是可以向上增长
  • 2.栈是可以向下增长

image.png

2.程序的局部变量,全局变量,静态变量,字符串,动态申请的数据都存放在哪个区域?

  • 局部变量存放于栈区
  • 全局区中存放着全局变量和静态变量
  • 字符串存放于常量区
  • 动态申请存放于堆区中

image.png

3.编译阶段和链接阶段各自完成了那些工作?

  • 编译阶段:汇编和只编译;检查分析源代码的语法单元,检查代码的有效性,检查成功产生机器码符号等
  • 链接阶段:解析外部变量和函数引用找到符号连接数据库文件生成可执行文件

4.什么是野指针?什么是内存泄漏

  • 野指针是指向无效内存或者已被释放的内存的指针
  • 内存泄漏并非指内存物理消失,而是程序在申请内存后未能正确释放,导致该部分内存无法再被使用,长期累积将占用大量系统资源,最终影响程序甚至系统的稳定性。

5.realloc和malloc功能上有什么区别?

  • malloc() 函数分配的内存空间位于堆中,而不是栈中。因此,在使用完这块内存之后,一定要将其释放掉
  • malloc() 函数成功分配内存空间后会返回一个指针,因为分配的是一个 int 型空间,所以返回指针时也应该使用对应的 int 型指针,这样就要进行强制类型转换。最后将函数返回的指针赋值给指针 pInt,就可以保存动态分配的整型空间地址了。
  • calloc() 函数会返回一个指针,该指针指向动态分配的连续内存空间的首地址。当空间分配错误时,返回 NULL。
  • calloc() 函数的功能是在内存中动态分配 n 个长度为 size 的连续内存空间.