C语言变量的内存分配
1、 栈区(stack)。栈,就是那些由编译器在需要时分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。(由编译器管理)
2、 堆区(heap)。一般由程序员手动分配、手动释放,若程序员不释放,程序结束时可能由系统回收。注意,它与数据结构中的堆是两回事,分配方式类似于链表。
3、 全局区(静态区)(static)。全局变量和静态变量
程序结束后由系统释放。
4、 常量存储区。常量字符串就是放在这里的,其变量的值不允许修改,程序结束后由系统释放。
5、 程序代码区。以二进制形式存储程序代码。
C语言中:变量和函数都有两个属性:数据类型、数据的存储类别。
1、 变量按照作用域(即存储空间)角度:全局变量和局部变量。
a、 全局变量在程序开始执行时系统就给全局变量分配存储空间,整个程序执行完后系统(自动)释放这块空间。作用域范围整个程序。(存放在全局(静态)存储区)
b、 局部变量在函数声明或函数调用时由系统分配局部变量的存储空间,函数被调用完毕之后系统会释放局部变量(函数体)。作用域范围函数体内。(存放在栈区)
2、 变量按照变量值存在时间的生命周期(即生存期)角度:静态存储方式和动态存储方式。
a、 静态存储方式是程序在运行期间分配固定的存储空间
(存储位置:全局区(静态区))
b、 动态存储方式是程序运行期间根据(我们)需要系统给我们进行动态分配存储空间,程序运行结束后系统动态释放(或手动释放)。
(存储位置:堆区(手动开辟空间)和栈区(函数调用))
练习题:
1、选择题:
程序的局部变量存储在(B)中;全局变量存储在(C)中,动态申请数据存储在(A)中;调用malloc分配的空间存储在(A)中;二进制编码存储在(E)中;被const所修饰的普通变量存储在(D)中。
A、堆 B、栈 C、全局区 D、常量区 E、程序代码区
2、全局变量和局部变量在内存中的存储是否有区别?如果有,是什么区别?
答: 局部变量作用域范围函数体内。(存放在栈区)
全局变量作用域范围整个程序。(存放在全局(静态)存储区)
3、写出输出结果
#include <stdio.h>
void foo(int m, int n)
{
printf(“m=%d, n=%d\n”, m, n);
}
int main()
{
intb = 3;
foo(b+=3,++b); //先执行b+=3,得到6 ,再执行++b,得到7,返回到被调用函数,得到m=7,n=7
printf("b=%d\n",b);
return0;
}
答案:m=7 n=7
b=7
4、写出输出结果
int sum(int a)
{
int b=0;
static int c=3;//静态的局部变量:其值保存上一次的值
b+=1;
c+=1;
return(a+b+c);
}
int main()
{
int i;
int a=5;
for(i=0;i<3;i++)
{
printf("%d%d\n",i,sum(a));
}
return0;
}
答案: 当i=0时,执行被调用函数中a=5,b=1,c=4,a+b+c=10
当i=1时,执行被调用函数中a=5,b=1,c=5,a+b+c=11
0 10 当i=2时,执行被调用函数中a=5,b=1,c=6,a+b+c=12
1 11
2 12
5、写出输出结果
int main()
{
inti=2,j=3,k;
k=i+j;
{
intk=8;
printf("%d\n",k); //输出函数在内部执行语句,输出的结果为8
}
printf("%d\n",k); //输出函数在外部执行语句,输出结果为5
}
答案:8
5
6、写出输出结果
int a=3,b=5;
int max(int a,int b) /*形式参数变量a的值为局部变量的值, 形式参数变量b的值为全局变量的值*/
{
int c;
c=(a>b ? a : b);
return(c);
}
int main()
{
int a=8;
printf("%d\n",max(a,b)); //a=8,b=5
return0;
}
答案:8
解析:如果同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内, 全局变量被“屏蔽”,即它不起作用。
7、什么是内连函数?定义内连函数的好处是什么?
答案:将函数调用的语句用函数执行的语句给替换掉,过程发生在程序的编译时期
优点:节省程序的时间,提高程序的执行效率