文章目录

  • 1、背景
  • 2、变量定义和声明
    • 1、局部变量和全局变量
    • 2、变量的存储类别
    • 3、例题
    • 4、内存泄漏

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。
指针在使用前需要校验是否为空
记住指针的长度,在移动指针时避免地址越界。
动态分配内存的指针最好不要再赋值。

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

  1. 4、C语言面试笔试--内存操作-指针

    文章目录 1.指针变量 1.1 基本概念 1.2 指针运算 1.3 面试题 2. 常量和常量指针 2.1 字面常量和符号常量 2.2 const指针常量 2.2.1 常量指针 2.2.2 常量指针变量 ...

  2. 2、C语言面试笔试---运算符和表达式

    文章目录 背景 1.运算符和表达式 1.1自增自减运算符++与-- 1.2 C语言符号的优先级 1.3 类型转换 1.4 顺序点的概念 1.5 贪心法 2.面试笔试例题 背景 1.运算符和表达式 1. ...

  3. c语言关于内存笔试,4、C语言面试笔试--内存操作-指针

    文章目录1.指针变量1.1 基本概念1.2 指针运算1.3 面试题2. 常量和常量指针2.1 字面常量和符号常量2.2 const指针常量2.2.1 常量指针2.2.2 常量指针变量2.2.3 指针常 ...

  4. 5、C语言面试笔试--数据组织--数组

    文章目录 1.一维数组 2.一维数组和指针的区别 3.sizeof的使用 4.二维数组 5.用一级指针访问二维数组元素 6.字符数组和字符串数组 7.strlen函数与sizeof运算符号的差别 8. ...

  5. c语言程序中变量先引用声明,C语言如何跨文件调用函数定义中声明的变量

    变量的作用域 我们知道,变量根据其作用域有全局变量和局部变量之分.全局变量作用域是整个文件,并且可以使用关键字 extern 达到跨文件调用的目的.但是局部变量值作用于它当前所在的块(即该变量所处最内 ...

  6. c语言变量申明和定义区别,C语言中变量定义与声明的区别

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介 ...

  7. 变量定义和声明的区别(整理)

    变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中 ...

  8. C++ 笔记(05)— 变量(变量定义、声明、初始化、extern关键字、变量之间转换)

    1. 变量定义 变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储.变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: type variable_list; ...

  9. 变量定义和声明的区别~~~概念上千万不要栽跟头!!!

    变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中 ...

最新文章

  1. 阿里巴巴Web前端面试的一道JS题目,求解答!!!
  2. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
  3. redis 源码 dict.c 实现
  4. java getscale_Java MajorType.getScale方法代碼示例
  5. python发邮件给女朋友代码_python发邮件的代码
  6. 电脑技巧:C盘爆满该如何清理,实用的清理方案,小白必备
  7. fastjson转换时有大括号或者冒号或者有中括号_[Python Basic] 字符串处理以及类型转换 1...
  8. python提取txt数据到excel_python 读取txt中每行数据,并且保存到excel中的实例
  9. python不支持的数据类型有achar bint cfloat dlist_第1篇:Cython的数据类型(第二部分)
  10. mac install: /usr/bin/unrar: Operation not permitted
  11. 常用排序算法:桶排序
  12. sql 常见查询代码操作
  13. vue-video-player,切换页面时控制台报错:TypeError: this.el_.vjs_getProperty is not a function解决方案
  14. linux下玩三国志游戏,三国志威力无双手游官网版
  15. 【Python】关于DataFrame数据类型二三事
  16. 从 DP 到 DDP 到 apex
  17. 麻省理工学院从算法层面揭示男女配对的自然法则(扎心真相!!!)
  18. 如何快速实现移动 App 对智能设备的连接和控制,打造丰富的智能生活场景?
  19. 2018六校联合周赛上学期第一场-我来爆零啦 寻找中位数 kth
  20. Ubuntu12.04 安装Skype

热门文章

  1. 【去广告首选】优酷云-A站-B站-优酷-乐视-搜狐--pptv 接口分享
  2. JavaScript学习记录总结(四)——js函数的特殊性
  3. Log Cauchy分布的一个Hierarchical模型:LC=Gamma+Gamma+Unif
  4. UA MATH564 概率论 高阶矩的计算:有限差算子方法2
  5. 矩阵分析与多元统计12 0-1矩阵 交换矩阵与Kronecker乘积
  6. UA MATH ECE636 信息论10 Group Testing简介
  7. PE文件重定位概念学习
  8. Win32 汇编子过程总结
  9. Java Hibernate模板 学习总结
  10. jQuery时间轴特效