1、C语言面试笔试---变量定义和声明
文章目錄
- 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會造成空間的不連續,從而造成大量的碎片,使程序效率降低。
上面,我舉了個例子,我們可以看到驗證了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语言面试笔试---变量定义和声明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32--对固件库的认识2
- 下一篇: 2、C语言面试笔试---运算符和表达式