内存分配方式(一)

时间:2023-01-11 23:02:33

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、什么是内连函数?定义内连函数的好处是什么?

答案:将函数调用的语句用函数执行的语句给替换掉,过程发生在程序的编译时期

优点:节省程序的时间,提高程序的执行效率