1 1。关于内存(程序的执行需要内存的支持) 2 (1)内存本身在物理上是硬件器件,由操作系统提供 3 (2)内存的管理最终由操作系统统一管理。为了能过便捷的管理内存(酒店管理房间 是不是分很多不同的类型和待遇呢),同样操作系统提供了多种的机制来让了多种机制来让我们应用程序使用内存。这些机制彼此不同,各自有各自的特点,我们程序根据自己的实际情况来选择某种方式获取内存(在操作系统处登记这块内存的临时使用权限)、使用内存、释放内存(向操作系统归还这块内存的使用权限)。也就是在进入酒店拿到钥匙或者卡,然后就可以进入一个编号为XX的房间,也就是你此时有临时的使用权限比如为一晚,第二天时间一到你就的归还钥匙或者卡,也就是释放内存。 4 2。C语言能够获取内存的三种方式: 5 栈 堆 数据区 6 3。关于栈 7 spec1: 8 运行的时候自动分配而且自动回收,程序员不用人工的去干预 9 spec2:反复使用 10 栈内存在程序中就是一块空间 程序反复使用这块空间 11 spec3:脏内存 12 为啥是脏的呢,反复使用,使用了就算了还不去清理,操作系统也不会帮你打理,哪有大哥给你做饭还洗碗的。因此分配到的时候保留的是原来的值,所以啊,变量定义最好初始化,不然出事儿都不知道啥情况 13 spec4:临时的(函数不能返回栈变量的指针,因为这个空间是临时的,注意了,很多时候我们想得到变量的地址,取出来用指针指向它,然后操纵它,但是这个之后,一旦其他的函数因为也是在栈中,很有可能就会取代刚才那块空间,这样就得不到理想的结果) 14 程序一执行完,你达到了目的,你就可以走了,让给其他的人也可以用这块空间。看看,多么人性化 15 16 #include <stdio.h> 17 18 19 // 函数不能返回函数内部局部变量的地址,因为这个函数执行完返回后这个局部变量已经不在了 20 // 这个局部变量是分配在栈上的,虽然不在了但是栈内存还在还可以访问,但是访问时实际上这个 21 // 内存地址已经和当时那个变量无关了。 22 int *func(void) 23 { 24 int a = 4; // a是局部变量,分配在栈上又叫栈变量,又叫临时变量 25 printf("&a = %p\n", &a); 26 return &a; 27 } 28 29 void func2(void) 30 { 31 int a = 33; 32 int b = 33; 33 int c = 33; 34 printf("in func2, &a = %p\n", &a); 35 } 36 37 void stack_overflow(void) 38 { 39 int a[10000000] = {0}; 40 a[10000000-1] = 12; 41 } 42 43 void stack_overflow2(void) 44 { 45 int a = 2; 46 stack_overflow2(); 47 } 48 49 50 int main(void) 51 { 52 //stack_overflow(); 53 stack_overflow2(); 54 /* 55 int *p = NULL; 56 p = func(); 57 func2(); 58 func2(); 59 printf("p = %p\n", p); 60 61 printf("*p = %d.\n", *p); // 证明栈内存完了后是脏的 62 */ 63 return 0; 64 }
学习笔记,嘻嘻,感觉不错。勿喷~~
时间: 2024-10-06 09:54:27