================ 內存管理 ===============
1.從地地址到高地址依次爲:代碼區、數據區、堆區、棧區、命令行參數及環境變量區域程序員
2.
局部變量:局部變量位於棧區函數
棧區特色: 1.棧區當中變量未初始化以前都爲隨機值
2.在變量做用域結束後,變量空間被操做系統收回操作系統
全局變量:全局變量位於數據區命令行
數據區特色:
1.數據區中變量未初始化以前都是0
2.在程序結束後,變量空間被操做系統收回內存
靜態變量:靜態變量位於數據區
特色:
1.數據區中變量未初始化以前都是0
2.在靜態變量做用域結束後,並不會被操做系統收回變量空間
3.靜態變量也是有做用域的,雖然靜態變量在做用域結束後沒有被操做系統回收變 量空間但在做用域外扔沒法操做該靜態變量作用域
常量:常量位於數據區字符串
數據區分爲:
1.文字常量區 存放字符串常量
2.未初始化的靜態變量區 存放未初始化化的靜態變量 .bss
3.已初始化的靜態變量區 存放已經初始化的靜態變量 .rodata內存管理
1.堆區:程序員經過malloc函數得到的一片區域編譯
2.注意:程序經過malloc得到堆區空間後,在程序結束時必需要free掉堆區空間不然將致使內存泄漏
malloc
free變量
========================== Makefile ======================
1.GNU推出的一款軟件
2.在project文件中,在命令行下輸入make,操做系統會自動尋找當前目錄的下的makefile,按照makefile規則去編譯project下的相關文件
3.基本形式:
main:main.o fun1.o fun.o gcc main.o fun1.o fun.o -o main
main.o:main.c
gcc -c main.c -o main.o
fun1.o:fun1.c
gcc -c fun1.c -o fun1.o
fun.o:fun.c
gcc -c fun.c -o fun.o
4.makefile變量
OBJS = main.o add.o
OBJ = main
CC = gcc
使用變量用$(OBJS)
$(OBJS)
$(CC)
5.自動變量
$@ 目標文件的完整名稱
$< 第一個依賴文件的名稱
$^ 全部的不重複的目標依賴文件,以空格隔開
方式一:
CC=gcc
CFLAGS=-O2 -Wall
OBJ=main
OBJS=main.o fun1.o fun.o
$(OBJ):$(OBJS)
$(CC) $(OBJS) -o $(OBJ)
main:main.o fun1.o fun.o
gcc main.o fun1.o fun.o -o main
main.o:main.c
gcc -c main.c -o main.o
fun1.o:fun1.c
gcc -c fun1.c -o fun1.o
fun.o:fun.c
gcc -c fun.c -o fun.o
.PHONY:
clean:
rm *.o main
方式二:
CC=gcc
CFLAGS=-O2 -Wall
OBJ=main
OBJS=main.o fun1.o fun.o
$(OBJ):$(OBJS)
$(CC) $(OBJS) -o $(OBJ)
main.o:main.c
$(CC) -c $< -o $@
fun1.o:fun1.c
$(CC) -c $< -o $@
fun.o:fun.c
$(CC) -c $< -o $@
.PHONY:
clean:
rm *.o main
方式三:
CC=gcc
CFLAGS=-O2 -Wall
OBJ=main
OBJS=main.o fun1.o fun.o
$(OBJ):$(OBJS) $(CC) $(OBJS) -o $(OBJ)%.o:%.c $(CC) -c $^ -o $@