变量、生存期、堆栈

static c 静态局部变量的占用的存储单元不释放,但其值是可以改变的,也即等于上一次函数调用结束时的值。

如果定义静态局部变量时不赋初值的话,那么编译时自动赋初值0或者空字符,而自动变量由于内存重新分配释放其指向的内容是不可知的。因此使用静态局部变量会降低程序的可读性,因为往往弄不清楚静态局部变量的当前值是什么。Static静态局部变量涉及到了生存期的问题。

static静态全局变量,因为全局变量无论是不是static都是放在静态存储区的,不涉及生存期问题,所以静态全局变量的作用只限于本文件模块。同理有定义静态函数(内部函数),静态函数只能在本文件模块中使用,不用担心与其他文件中的函数同名的问题。由此,static的作用就是局部化而已。

Register寄存器变量,存储于CPU中的寄存器中,存取速度快,因为当前优化的编译系统能够识别使用频繁的变量,因此register使用并不多。

一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等。其操作方式类似于数据结构中的栈。

2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、静态区(static)—全局变量和局部静态变量的存储是放在一块的。程序结束后由系统释放。

4、文字常量区—常量字符串就是放在这里的,程序结束后由系统释放 。

5、程序代码区— 存放函数体的二进制代码。

---来自百度百科,需要了解关于数据结构的东西

http://blog.csdn.net/yangle4695/article/details/52153143   关于堆栈、内存池等。

如果我们在函数内部定义了一个局部变量,并想要return返回此局部变量或者此局部变量的地址时,程序会发出警告:返回了局部变量的地址。这是因为局部变量放在了里,函数调用结束后随之释放,也即调用函数无权使用该内存。

但是综上,除了定义全局变量和静态局部变量,在函数内部建立一个指针并返回是完全可以的,前提是我们必须自己new或者mallloc一个,因为动态内存的分配是在里的,函数结束时该内存仍然存在,但是要注意在程序结束之前我们必须手动释放掉。

可用memset()函数对刚申请的空间进行清零操作,良好的编程习惯,包含头文件<memory>

原文地址:https://www.cnblogs.com/gzl0928/p/7764119.html