C语言面试题小练——第8天:static的作用、全局变量与局部变量的存储空间、宏定义注意点
文章目录
- 1. static有什么作用(至少两种)
- 2. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
- 3. 写一个宏,返回两个参数中较小的一个
1. static有什么作用(至少两种)
我的解答:
- static修饰局部变量,使其内存不被释放。
- static修饰函数,使其不能被其他文件调用。
网上参考:
1.修饰全局变量或函数,用于限定该变量或函数作用域为本文件。(这种限定是针对编译器而言,运行时没有区别)
2.修饰局部变量,用于修改变量的生存周期,维持持久性。
2. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
我的解答(错误!!!)
全局变量存放在堆空间 中,局部变量存放在栈空间中。
分析:全局变量存放在全局存储区,不是堆空间(堆空间存放的是动态分配的变量)。
网上参考:https://blog.csdn.net/weixin_36194037/article/details/78871097
答:有区别。
全局变量保存在内存的全局存储区,占用静态的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。
引申:
C语言经过编译之后将内存分为以下五个区域
1.栈:由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数,局部变量,返回值及函数返回地址。操作方式类似数据结构中的栈。
2.堆:用于程序动态申请分配和释放空间。C语言中的malloc和free,C++中的new和delete均是在堆中进行的。正常情况下,程序员申请的空间在使用结束后应该释放,若程序员没有释放空间,则程序结束时系统自动回收。注意,这里的”堆”并不是数据结构中”堆”。
3.全局(静态)存储区:分为DATA段和BSS段。DATA段(全局初始化区)存放初始化的全局变量和静态变量;BSS段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中,BSS段在程序执行之前会被系统自动清零,所以未初始化全局变量和静态变量在程序执行之前已经为0。
4.文字常量区:存放常量字符串。程序结束后由系统释放。
5.程序代码区:存放程序的二进制代码。
显然,C语言中的全局变量和局部变量在内存中是有区别的。C语言中的全局变量包括外部变量和静态变量,均是保存在全局存储区中,占用永久性的存储单元;局部变量即自动变量,保存在栈中,只有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元。
————————————————
版权声明:本文为CSDN博主「别是清欢」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36194037/article/details/78871097
3. 写一个宏,返回两个参数中较小的一个
我的解答:
#define MIN(A, B) ((A) > (B) ? (B) : (A))
测试:
#define MIN(A, B) ((A) > (B) ? (B) : (A))#include <stdio.h>int main()
{int A = 0, B = 0;puts("输入两个数");scanf("%d%d", &A, &B);printf("最小值为:%d\n", MIN(A, B));return 0;
}
结果:
注意点:宏定义中的变量参数最好(很有必要)加上括号
下面举个反例:
#define MIN(A, B) ((A) > (B) ? (B) : (A))
#define MIN2(A, B) A > B ? B : A#include <stdio.h>int main()
{int A = 0, B = 0;puts("输入两个数");scanf("%d%d", &A, &B);printf("正解:%d\n", 8 * MIN(A, B));printf("反例:%d\n", 8 * MIN2(A, B));return 0;
}
运行结果:
上面测试程序的目的是输出最小值的8倍
如果不加括号,原来的8 * ( 1 > 2 ? 2 : 1 )
变成了8 * 1 > 2 ? 2 : 1
,因为在预处理阶段,编译器只会将宏定义进行替换,不会先求出结果。
C语言面试题小练——第8天:static的作用、全局变量与局部变量的存储空间、宏定义注意点相关推荐
- C语言面试题小练——第18天:15道嵌入式软件基本题(下)
文章大部分内容来源网络(伪原创,从网上下载的题目) 考查一个初级嵌入式系统开发人员的C基本功,附有答案.题目由资深嵌入式系统专家拟定,目的是考查入门级的嵌入式软件开发人员 .Gavin Shaw提供详 ...
- C语言面试题小练——第10天:宏定义一年的秒数、变量定义练习、关键字volatile有什么含意
文章目录 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) 2. 用变量a给出下面的定义 3. 关键字volatile有什么含意?并给出三个不同的例子. 1. 用 ...
- c语言语法基础之——局部变量及存储类别、全局变量及存储类别、宏定义 学习
宏定义 // 宏定义只是替身,不需要小括号,一般命名用大写字母 #define B(c) c*c main(){int m=5, n=8,k; k=10*B(m+n); // 是 10*5+8*5+8 ...
- 记一次海康威视笔试题小练手
今天老师在群里发了海康威视的校招信息,有点心动,上牛客找到面经看到有3道笔试题,就顺便试试,都是用js写. 第一题 <!DOCTYPE html> <html lang=" ...
- c语言编写计算ackerman函数的递归函数ack(n,x,y),第六章函数与宏定义实验报告二...
C程序设计实验报告 实验项目: 6.4.2.2. 利用复化梯形公式计算定积分 6.4.2.3. 计算Ackerman函数 6.4.3.1. 编写计算x的y次幂的递归函数getpower(int x,i ...
- 华为 社招 C语言笔试,华为笔试C语言笔试题之3
<华为笔试C语言笔试题之3>由会员分享,可在线阅读,更多相关<华为笔试C语言笔试题之3(10页珍藏版)>请在人人文库网上搜索. 1.C 语言笔试题之34. static 有什么 ...
- C语言程序设计(理论课)第八章 函数与宏定义
第八章 函数与宏定义 8.1函数的概念 为什么要使用函数? ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ...
- C语言宏定义#define
宏定义是高级语言编译器提供的常用语法,其目的是利用某一标识符标识某个文本字符串.在编写程序时,如果程序中反复地使用某个数据或某段程序片段,就可以考虑将这个数据或程序片段定义为宏,然后每个出现 ...
- C语言3067答案,教师招聘《小学教育心理学》通关试题每日练(2020年03月03日-3067)...
1:将学习策略分为基本策略和支持策略的是( ). 单项选择题 A.丹瑟洛 B.尼斯比特 C.皮连生 D.鲍斯菲尔德 2:奠定儿童人格和心理健康基础的是( ). 单项选择题 A.社会 B.家庭 C.学校 ...
- c语言数组蛇形编程,C语言每天小练(二)——蛇形数组
C语言每日小练(二)--蛇形数组 例:在n*n方阵里输入1,2,3,...,n*n,要求填成蛇形.例如n=4时方阵为: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 ...
最新文章
- ML与Information:机器学习与Information信息论之间那些七七八八、乱七八糟、剪不断理还乱的关系攻略
- animate 实现滑动切换效果
- 安全,从写第一行代码开始!
- Microsoft .Net Remoting系列专题之二
- pythonlist详解_零基础入门Python3-列表list详解
- ZooKeeper 基本操作
- Win 2003安装过后的一些配置技巧
- MYSQL initialize、install 、启动服务报错解决方法
- 员工未回复群消息全员被罚200元,企业:符合公司规章制度! 律师回复来了......
- 大聊Python----Select解析
- 实现移动端H5页面调用摄像头
- 郑大研究生计算机科学与技术,21郑大考研计算机科学与技术、软件工程考研数据分析...
- 免费学习coursera的课程的操作办法
- IntelliJ IDEA设置修改字体大小与样式
- latex bib是什么 从哪里获取 文献引用
- ElasticSearch windows部署(避坑干货)
- 假设检验:p-value,FDR,q-value
- [AFCTF2018]One Secret, Two encryption(考点:公钥解析,gcd())
- 移动叔叔工具箱android,移动叔叔工具箱
- java option请求_Spring boot处理OPTIONS请求