1、C语言面试笔试---变量定义和声明

1、背景

2019秋招马上开始了,今天已经是7月30号了,赶紧刷刷C语言,争取在8月中旬刷完C语言,在8月末再加强巩固,一来是可以准备面试笔试,二来是可以通过重新对C语言的认识,加速STM32的学习,为FPGA的软核硬核打下基础。本系列是针对以前学过C语言,但是后来就没怎么用了的,非针对一点基础都没有的。

2、变量定义和声明

1、局部变量和全局变量

**局部变量:**在函数内部定义的变量为内部变量,所以局部变量的作用于受限于定义它的函数。
**全局变量:**在函数之外定义的变量为外部变量,它的作用于为定从定义变量的位置开始到本源程序文件结束,称之为全局变量,所以全局变量的作用于仅限制于定义它的源程序文件。
特此说明定义在main函数里面,并不是全局变量,只是局部变量

2、变量的存储类别

变量的存储类别可以分为动态存储和静态存储。其中动态存储包含:auto自动变量,register寄存器变量。静态存储包括:extern外部变量和static静态变量。比如说int a[10] 一旦遇到这个定义,系统采用静态方式分配10个int空间给a,无论程序向数组a中放不放元素,这一片空间都被占用,他也属于自动变量,当超出作用范围系统自动释放其内存空间。
如下图所示,内存空间可以分为4部分。**以下这个图片要牢记。**注意对于对空间频繁地malloc/free会造成空间的不连续,从而造成大量的碎片,使程序效率降低。
在这里插入图片描述

```c
#include <stdio.h>
int n;
void main()
{
	
	static p;

	printf("%d\n%d\n",n,p);		

}

在这里插入图片描述
上面,我举了个例子,我们可以看到验证了BSS,全局变量和静态局部变量存储在BSS中,BSS段用来存放程序中为初始化的全局变量和未初始化的静态局部变量,在执行程序时,BSS段会预先清空,所以存储在BSS段中的变量均默认是0,这就是为什么外部变量和静态局部变量可以不初始化,但是会被赋予默认值0.

3、例题

说出下变变量存储类型,以及输出结果

```c
#include <stdio.h>
static int a=1;
void fun1(void)
{
a=2;
}
void fun2(vod)
{
int a=3;
}
void fun3(void)
{
static int a=4;
}
int main()
{
printf("%d\n",a);
fun1();
printf("%d\n",a);
fun2();
printf("%d\n",a);
fun3();
printf("%d\n",a);



}

在这里插入图片描述
注意只有fun1,才是改变全局静态变量的值。其余均不能改变。

4、内存泄漏

**内存泄漏(Memory Leak)**是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
如何避免内存泄漏?
例题:
什么是内存泄漏?面对内存泄漏和指针越界,你有什么方法?你通产采用哪些方法啦避免和减少这类错误?
在程序中采用动态分配函数开辟堆空间,使用完毕后没有释放,一直占用内存空间导堆控件耗尽,称之为内存泄漏。
为了避免和减少内存泄漏及指针越界这类错误,可以采用以下基本方法:
采用malloc等函数动态分配的空间在不需要时及时通过free函数释放掉。
定义指针后务必初始化,即使没有初始化为指向特定的地址空间也要初始化为NULL。
指针在使用前需要校验是否为空
记住指针的长度,在移动指针时避免地址越界。
动态分配内存的指针最好不要再赋值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值