iOS面试题-C部分
### iOS面试题-C部分知识点详解####一、Static关键字的作用1. **隐藏功能**:当我们在编译多个文件时,所有未加`static`前缀的全局变量和函数都具有全局可见性。添加`static`关键字后,变量或函数的作用域仅限于当前文件,从而实现了对其他文件的隐藏。 2. **保持变量内容的持久性**:存储在静态数据区的变量(如`static`变量和全局变量)会在程序启动时初始化,并且只初始化一次。这种特性确保了即使在函数调用结束后,变量的值仍然保留。 3. **默认初始化为0**:在静态数据区,所有内存的初始值默认为0x00。这意味着对于未显式初始化的`static`变量或全局变量,默认值为0,这有助于减少不必要的初始化工作。 ####二、线程与进程的区别和联系- **区别**: - **进程**:是资源分配的基本单位,拥有独立的地址空间和其他系统资源,是操作系统进行资源管理和调度的基本单位。 - **线程**:是处理器调度和分派的基本单位,是比进程更小的能独立运行的基本单位,属于同一进程的不同线程共享进程的所有资源(代码段、数据段等),但每个线程都有自己的寄存器内容和栈。 - **联系**: -多个线程可以在同一个进程中运行,共享进程的数据空间。 -进程可以通过创建线程来实现并发执行任务。 ####三、堆和栈的区别1. **栈**:由编译器自动分配和释放,用于存放函数的参数值、局部变量等。操作方式类似于数据结构中的栈,遵循先进后出的原则。 2. **堆**:通常由程序员手动分配和释放,若程序员忘记释放,则可能由操作系统在程序结束时回收。堆空间的分配和释放相对灵活,但效率较低。 ####四、判断两个单向无环链表是否相交-方法:比较两个链表的尾节点地址是否相同。如果相同,则表示这两个链表相交;如果不相同,则表示它们不相交。 ####五、程序在内存中运行时的内存分区及其用途1. **栈区**:由编译器自动分配释放,用于存储函数的参数值、局部变量等。 2. **堆区**:通常由程序员手动分配和释放,若不释放,在程序结束时可能由操作系统回收。 3. **全局区(静态区)**:用于存储全局变量和`static`变量。初始化的全局变量和静态变量在一个区域,未初始化的全局变量和静态变量在另一个相邻的区域。 4. **常量区**:专门用于存储常量,如字符串常量等。程序结束时释放。 ####六、引用与指针的区别- **指针**指向一块内存,其内容是所指内存的地址;而**引用**是某块内存的别名。 - **具体区别**: -指针是一个实体,而引用仅是个别名。 -使用引用时无需解引用,而使用指针时需要解引用。 -引用只能在定义时初始化一次,之后不可更改;指针可以改变所指向的对象。 -引用没有`const`修饰符,指针可以有。 -引用不能为空,指针可以为空。 - `sizeof`引用得到的是所指向的变量的大小,而`sizeof`指针得到的是指针本身的大小。 -指针和引用的自增(++)运算意义不同。 -从内存分配上看,程序为指针变量分配内存区域,而引用不需要分配内存区域。 ####七、编程题解析1. **Test函数结果分析**: - (1)`GetMemory`函数并没有正确地传递动态内存给调用者。因此,`Test`函数中的`str`一直为`NULL`。当执行`strcpy(str, "helloworld")`时,程序会崩溃。 - (2)`GetMemory`返回的是栈内存的指针,该内存可能在函数退出后被释放,导致`Test`函数中打印的结果可能为乱码或未知内容。 - (3)`GetMemory2`正确地通过双指针传递了动态内存的地址给`Test`函数。因此,`Test`函数能够输出`hello`,但由于没有显示释放内存,存在内存泄漏的问题。 - (4)题目未完整展示,但可以看出`Test`函数中`str`通过`malloc`分配了内存,并尝试赋值字符串`"hello"`。由于题目提供的代码片段不完整,无法准确预测最终结果,但根据已给出的信息,可能存在内存泄漏问题。
116.13KB
文件大小:
评论区