文章目录
1. static有什么作用(至少两种)2. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?3. 写一个宏,返回两个参数中较小的一个1. static有什么作用(至少两种)
我的解答:
static修饰局部变量,使其内存不被释放。static修饰函数,使其不能被其他文件调用。
网上参考:
1.修饰全局变量或函数,用于限定该变量或函数作用域为本文件。(这种限定是针对编译器而言,运行时没有区别)
2.修饰局部变量,用于修改变量的生存周期,维持持久性。
2. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
我的解答(错误!!!)
全局变量存放在堆空间中,局部变量存放在栈空间中。
分析:全局变量存放在全局存储区,不是堆空间(堆空间存放的是动态分配的变量)。
网上参考:/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版权协议,转载请附上原文出处链接及本声明。
原文链接:/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
,因为在预处理阶段,编译器只会将宏定义进行替换,不会先求出结果。