面试题引发的思考:
Q: 内存的几大区域?
-
按照内存地址由低到高分配依次为以下区域:
预留区域、代码段、数据段、堆、栈、内核区。
iOS程序的内存布局
由以上内存分布分析图可分析一下代码:
// TODO: ----------------- main -----------------
int a = 10; // 已初始化的全局变量、静态变量等
int b; // 未初始化的全局变量、静态变量等
int main(int argc, char * argv[]) {
@autoreleasepool {
static int c = 20; // 已初始化的全局变量、静态变量等
static int d; // 未初始化的全局变量、静态变量等
int e = 30; // 栈
int f; // 栈
NSString *str = @"123"; // 字符串常量
NSObject *obj = [[NSObject alloc] init]; // 堆
NSLog(@"\n&a =%p\n&b =%p\n&c =%p\n&d =%p\n&e =%p\n&f =%p\nstr=%p\nobj=%p",
&a, &b, &c, &d, &e, &f, str, obj);
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
打印结果如下:
// 打印结果:------------
&a =0x104af7eb8
&b =0x104af7f84
&c =0x104af7ebc
&d =0x104af7f80
&e =0x7ffeeb109cdc
&f =0x7ffeeb109cd8
str=0x104af7080
obj=0x600003ba8090
根据内存分布分析图可知其中一些特性:
// 字符串常量 - 以 0x1 开头
str=0x104af7080
// 已初始化的全局变量、静态变量等 - 以 0x1 开头
&a =0x104af7eb8
&c =0x104af7ebc
// 未初始化的全局变量、静态变量等 - 以 0x1 开头
&b =0x104af7f84
&d =0x104af7f80
// 堆 - 以 0x6 开头
obj=0x600003ba8090
// 栈 - 以 0x7 开头
&f =0x7ffeeb109cd8
&e =0x7ffeeb109cdc