vlambda博客
学习文章列表

【C语言进阶篇】之函数&内存分布

1.static函数
static int Test1();
static可以限定函数的作用域:只能被本文件中的其他函数调用,而不能被同一程序其他文件中的函数调用。

2.extern函数
extern int Test2();
a) extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模板中寻找其定义;
b) extern “C”的含义:在C++出现以前,很多代码都是C语言写的,而且很多底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言语法进行编译。
 
3.inline函数
inline int Test3();
优点
a) 没有调用开销,效率高;
b) inline函数同宏定义一样,可以解决一些频繁调用的小函数大量消耗栈内存的问题,但同时inline是一个函数,调用函数时,编译器会检查参数类型,消除宏定义的隐患。
缺点:
内联函数太复杂或者调用点太多,展开后导致代码膨胀带来的恶化可能大于效率提升带来的益处。
注意:
内联函数一定要在头文件中定义,否则编译器会忽略内联函数的定义。
 






内存分布

BSS

数据段

代码段

1) BSS段:存放程序中 未初始化的全局变量,不占用执行程序大小,其内容由操作系统初始化( 清零)。
2)数据段:存放程序中已初始化的全局变量。
3)代码段:存放程序执行代码的内存区域,大小在程序运行前已经确定,并且通常属于 只读
4)堆:存放进程运行中被 动态分配 的内存段,大小并不固定,可动态扩张或缩减。malloc分配的为此地址。
5)栈:用户存放程序临时创建的 局部变量 (但不包括static声明的变量)。在函数被调用时,其参数也会被压入发起调用的进程栈。

小练习:
int c;
void fun(int a)
{
static int b;
int array[5]={0};
int *p=(int*)malloc(100);
b=a;
c=b+1;
return;
}

以下说法正确的是:
a.放在栈里的变量有a, p, array
b.放在栈里的变量有a, array, b
c.放在BSS段里的变量有b, c
d.放在堆里的变量是p指向的内存
答案将在留言中揭晓哦~