
对于C语言来说根据分配方式的不同数据的存储方式如下所示。从静态存储区域分配。内存在程序编译的时候就已经分配好这块内存在程序的整个运行期间都存在例如全局变量static变量等。在栈上创建。在执行函数时函数内非static局部变量的存储单元都是在栈上创建的函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中 效率很高但是分配的内存容量有限。从堆上分配亦称动态内存分配。程序在运行的时候用malloc/relloc/calloc等函数申请的内存程序员自己负责在何时用free释放内存。动态内存的生存期由程序员决定使用非常灵活但同时遇到问题也最多例如内存泄漏、内存越界、野指针问题此外即使规避了上述问题在嵌入式环境下因为内存较小碎片化问题也可能导致处理失败。当然还有一些变量不属于上述区域如const声明的变量存储在只读存储区对于单片机往往被分配到FLASH区域。这里从C语言实例来说明具体如下所示。#include #include int ex_val; // 全局变量 int ex_val_init 100; // 带初始化的全局变量 static int st_val; // 静态变量 static int st_val_init 100; // 带初始化的的静态变量 int main(int argc, char *argv[]) { int local_val; // 局部变量 static int static_local_val 0; // 带初始化的静态局部变量 int *p; static_local_val 1; // 动态内存分配堆内存 p malloc(sizeof(int)); if (p ! NULL) { *p 100; printf(*p: %d\n, *p); free(p); p NULL; } printf(ex_val: %d\n, ex_val); printf(st_val: %d\n, st_val); printf(local_val: %d\n, local_val); printf(static_local_val: %d\n, static_local_val); return 0; }关于上述代码执行结果如下所示。C语言的作用域不仅描述了标识符的可访问的区域其实也规定了变量的存储区域。对于变量的初始化问题全局变量和静态变量在编译时一般会被编译器默认初始化为0。而局部变量和动态分配的内存则被分配为之前使用过的栈地址和堆地址内部的值是不确定的。如果不进行初始化在使用时也没有设置直接就使用作为判断条件就会出现偶发性的出错问题。这个问题其实解释清楚涉及软件平台、编译器处理问题可能都有所不同。因此不建议去根据平台、编译器处理方法进行判断而是**变量在声明时一律进行初始化**避免出现这类问题。