搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 小幸运bz > 【C语言进阶篇】之函数&内存分布

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

小幸运bz 2020-06-28
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语言进阶篇】之函数&内存分布》的版权归原作者「小幸运bz」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注小幸运bz微信公众号

小幸运bz微信公众号:gh_343907474153

小幸运bz

手机扫描上方二维码即可关注小幸运bz微信公众号

小幸运bz最新文章

精品公众号随机推荐