前些天,一个以前的同事面试受挫,其中一条就挫死在内存上。 别的我不想多说,基础真的很重要,大家再来回顾一下C编译运行的内存机制。
在c中分为这几个存储区
- 栈 - 由
编译器
自动分配释放 - 堆 - 一般由
程序员
分配释放。若程序员没有释放,程序结束时由OS自己回收,当然也可能有回收不全的情况. - 全局区(或叫静态区) -
全局变量
和静态变量
的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束才释放。 - 常量区 - 另外还有一个专门放
常量
的地方。程序结束才释放。
举例说明:
a. 在函数体中定义的变量通常是在栈上,用malloc
, calloc
, realloc
等分配内存的函数分配得到的就是在堆上。
b. 在所有函数体外定义的是全局量,加了static
修饰符后不管在哪里都存放在全局区(静态区)
,在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。
c. 函数中的"adgfdf"
这样的字符串存放在常量区
。
Objective-C建立在C的结构图+函数+函数指针+……基础上的运行机制,基本相同,有不同地方,我一时也总结不出来,比较忙,就此先打住了。
另外,以上内容基本靠回忆没有严谨的再去查阅相关资料,如有谬误欢迎斧正。