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

Posted 小幸运bz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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指向的内存
答案将在留言中揭晓哦~

以上是关于C语言进阶篇之函数&内存分布的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶学习笔记三字符串函数+内存函数详解

C语言进阶动态内存管理

C语言进阶:字符串和内存函数

C语言进阶字符串与内存函数memcpymemmovestrcmpstrstr实现

C语言进阶—— 字符操作函数+内存操作函数详解 (吐血爆肝 !!!)

⭐️欢度国庆-共约C语言进阶⭐️ 动态内存管理+柔性数组 建议收藏