浅谈c语言程序为什么需要内存 栈又是什么?

 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

浅谈c语言程序为什么需要内存 栈又是什么?的相关文章

浅谈C语言内存管理、内存泄露、堆栈

1.内存分配区间: 对于一个C语言程序而言,内存空间主要由五个部分组成:代码段(.text).数据段(.data).静态区(.BSS).堆和栈组成. BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量 (这里注意一个问题:一般的书上都会说全局变量和静态变量是会自动初始化的,那么哪来的未初始化的变量呢?变量的初始化可以分为显示初始化和隐式初始化,全局变量和静态变量如果程序员自己不初始化的话的确也会被初始化,那就是不管什么类型都初始化为0,这种没有显示初始

浅谈C语言中的联合体(转载)

联合体union 当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union).在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构: 2)它的所有成员相对于基地址的偏移量都为0: 3)此结构空间要大到足够容纳最"宽"的成员: 4)其对齐方式要适合其中所有的成员: 下面解释这四条描述: 由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的.为

浅谈C语言中的强符号、弱符号、强引用和弱引用

摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014-10-31 我要评论 这篇文章主要介绍了C语言中的强符号.弱符号.强引用和弱引用的定义及相关内容,非常的简单易懂,有需要的朋友可以参考下 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑

浅谈c语言typedef 与结构体指针(个人小经验)

 #include<stdio.h> #include<string.h> typedef struct emp{ char sex[8]; char name[15]; int age; }*emp;//这里我们用typedef把emp这个结构体变成了*emp这种指向结构体成员的结构体指针 /*typedef struct emp{ char sex[8]; char name[15]; int age; }pi,*emp;//为了程序的可读性最好不要这样声明*/ int m

浅谈C语言字符串结束符&#39;\0&#39;

如果你希望你的字符串以’\0‘结束,那么你可以这样做: 1 char str[]={"hello"};//①字符串赋值 2 char str[]={'h','e','l','l','o','\0'};//②人为添加 3 char str[6]={'h','e','l','l','o'};//③故意给数组预留一个空位 注:当出现以下情况时,会发生'\0'丢失 1 char str[5]={"hello"};//①数组长度不够 2 char str[]={'h','e'

【C语言】C语言程序所占内存分类

参考"http://blog.sina.com.cn/s/blog_63d4849c01014qg3.html" C语言内存分为5部分:堆.栈.全局(静态)区.常量区(只读)和代码区. 堆,需要人工申请和释放内存,其他均为系统自动释放. 全局(静态)区.常量区:全局可见! #include <stdio.h> #include <malloc.h> int a=0;//初始化全局变量,存在“全局(静态)区(data)初始化”中,程序结束后由系统释放 char *

C语言程序编译的内存分配

C语言程序编译的内存分配: 1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等: 2.堆区(heap) --由程序员分配释放: 3.全局区或静态区 --存放全局变量和静态变量:程序结束时由系统释放,分为全局初始化区和全局未初始化区: 4.字符常量区 --常量字符串放与此,程序结束时由系统释放: 5.程序代码区--存放函数体的二进制代码 例: //main.c int a=0; //全局初始化区 char *p1; //全局未初始化区 void main() { i

浅谈:小程序的开发模式

浅谈:小程序的开发模式 小程序开发,主要可分为三种模式: 1.基于现成模板进行编辑的模式这种模式下,模板是最为首要的,用户首先选择一个最为接近需求的模板,然后采用编辑.配置的方式对模板的名字.标题.栏目名称/数量.图片等进行修改.优点:简单快捷,如果图片素材等提前准备到位了,通过模板编辑配置的模式开发微信小程序,一般1.2个小时就能搞定!缺点:1)找到匹配度足够满意的模板并不容易:这种模式比较依赖于模板供应方的模板库丰富程度,一般来说,最终用户的需求都是千变万化的,往往都是各有各的诉求,即便模板

C语言程序编写涉及内存的问题

在平常的C语言程序编写中往往都会涉及内存的问题,下面分享一些常见的问题范例及相关解答,可以学习IT500强面试官谈算法面试题. void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, “hello world”); printf(str); } 请问运行Test 函数会有什么样的结果? 答:程序崩溃. 因为GetMemo