1 CPU對(duì)寄存器的讀寫(xiě)一般是按照數(shù)據(jù)寬度一起進(jìn)行的,也就是32bit讀入,32bit寫(xiě)入,也就是假設(shè)我們只想修改其中某一個(gè)位的話(huà),也是整體讀取,修改特定位,然后整體寫(xiě)入
2 寄存器特定位清零用& var1 = 0xAAAAAAA若想將8到15位清零,可以使用 var1 &= 0xFFFF00FF
3 特定位置1用或 | var1 = 0xAAAA00AA置1 var1 |= 0x0000FF00
4 寄存器特定位取反 ^
5 使用宏定義來(lái)完成位運(yùn)算 將該位和1進(jìn)行或操作 #define SET_BIT_N(x,n) ((x)|((n)-1))
6 使用宏復(fù)位 將該位和0與,其它位和1與 #define CLEAR_BIT_N(x,n) ((x)&~((n)-1))
7 所謂的段錯(cuò)誤就是地址錯(cuò)誤,一般是指針指向的地址不存在或者寫(xiě)受到限制導(dǎo)致的
8 const一旦定義不能修改
9 數(shù)組傳參,傳的是數(shù)組元素的首地址
10 #define只是簡(jiǎn)單的宏替換,在預(yù)處理的時(shí)候進(jìn)行處理 typedef是重定義 在編譯時(shí)進(jìn)行處理
11 strlen以/0作為標(biāo)記區(qū)分,但統(tǒng)計(jì)不包括 /0
12 常量也稱(chēng)為字面量,沒(méi)有對(duì)應(yīng)的存儲(chǔ)單元
13 typedef本身并不產(chǎn)生新的變量類(lèi)型,而是給現(xiàn)有變量起一個(gè)別名,類(lèi)型本身并不占用內(nèi)存,而變量是這個(gè)磨具的實(shí)例
14 linux命令行默認(rèn)緩沖,直到遇到/n /r/n /r或者退出時(shí)才會(huì)輸出,所以,調(diào)試時(shí)最好加上/n以免誤判錯(cuò)誤位置
15 scanf不會(huì)接收最后的/n 等下次scanf接收時(shí),卻會(huì)收到它,可能導(dǎo)致并沒(méi)有拿到我們想要的數(shù)據(jù),注意下這點(diǎn)
16 內(nèi)存管理方式:棧(stack),堆(heap),數(shù)據(jù)區(qū)(.data和.bss區(qū))和常量區(qū)(.ro.data)
17 棧內(nèi)存管理的特點(diǎn):
1)運(yùn)行時(shí)自動(dòng)分配,運(yùn)行結(jié)束自動(dòng)回收
2)可以反復(fù)使用
3)臟內(nèi)存,它可以反復(fù)使用,每次使用后并不會(huì)去清空內(nèi)存,下次該空間被再次分配時(shí)上次使用的值還在
4)臨時(shí)性,函數(shù)不能反悔指針變量,因?yàn)槌绦蜻\(yùn)行結(jié)束之后該空間就會(huì)被釋放
18 堆內(nèi)存的特點(diǎn):
1)空間較大
2)要手動(dòng)申請(qǐng)和釋放
3)臟內(nèi)存,在使用完也不會(huì)清除數(shù)據(jù)
4)在malloc后和free前可以訪(fǎng)問(wèn),malloc前和free后不可再訪(fǎng)問(wèn),否則會(huì)造成不可預(yù)知的錯(cuò)誤
注:若分配的內(nèi)存未手動(dòng)釋放,這塊空間會(huì)一直被占用,只有整個(gè)程序結(jié)束時(shí)才會(huì)被釋放
malloc返回的是viod *型的指針,它表示萬(wàn)能指針,申請(qǐng)失敗返回NULL
malloc的一些細(xì)節(jié)表現(xiàn):
malloc(0)這么操作是沒(méi)有意義的,假設(shè)真的這么操作,它的返回值是不確定的
malloc(4)GC中的malloc是以16B為單位進(jìn)行空間分配的,若指定空間小于16B,會(huì)分配16B
19 (.text)代碼段:存放代碼,程序的各種函數(shù)指令就存放在這里
(.data)數(shù)據(jù)段:也稱(chēng)數(shù)據(jù)區(qū) 靜態(tài)數(shù)據(jù)區(qū) 靜態(tài)區(qū),程序中的靜態(tài)變量空間開(kāi)辟于此
.bss段:又稱(chēng)ZI(Zero Initial)段,所有的未初始化的靜態(tài)變量存放在這里,自動(dòng)把他們初始化為0
.data .bss無(wú)本質(zhì)差別,只是data用來(lái)存放顯式初始化為非0的數(shù)據(jù)
bss用來(lái)存放顯式初始化為0或者未初始化的數(shù)據(jù)
20 C中Const的試下有兩種:
1 存放在代碼段,(代碼段只讀),來(lái)達(dá)到不能修改,單片機(jī)常這么做
2 讓編譯器幫忙實(shí)現(xiàn),編譯器發(fā)現(xiàn)const修飾的變量試圖被修改時(shí)會(huì)提示錯(cuò)誤,本質(zhì)是和普通變量一樣的,GCC是這么做的
21 C中字符串的本質(zhì)是指向字符存放地址的指針
對(duì)于char *p = "linux"來(lái)說(shuō) p是指針變量,占用4或者8個(gè)字節(jié) Linux存儲(chǔ)于代碼段,占用6個(gè)字節(jié)
22 sizeof得到的是類(lèi)型的占用字節(jié)大小,在編譯階段就可以確定大小
strlen得到的是字符串的長(zhǎng)度
23 #PRama pack(n) 告訴編譯器,我們希望以幾個(gè)字節(jié)對(duì)齊
24 結(jié)構(gòu)體是多個(gè)獨(dú)立元素(地址空間)打包在一起,union是一個(gè)元素(地址空間)的不同解析方式
union的sizeof檢測(cè)到的值是各個(gè)元素占用空間最大的那個(gè)元素的大小,不存在內(nèi)存對(duì)齊,因?yàn)橹挥幸粋€(gè)元素
struct的sizeof檢測(cè)到的是所有元素占用內(nèi)存的總和,要考慮內(nèi)存對(duì)齊
25 GCC中一些常見(jiàn)的文件擴(kuò)展名
.c C語(yǔ)言源代碼
.a 目標(biāo)文件構(gòu)成的靜態(tài)庫(kù)文件
.h 頭文件
.i 經(jīng)過(guò)預(yù)處理的C源碼文件
.ii 預(yù)處理后的C++源文件
.m Object-C 源文件
.o 編譯后的目標(biāo)文件
.out 連接器生成的可執(zhí)行文件
.s 匯編源文件,不再進(jìn)行預(yù)處理,不可包含預(yù)處理指令
.S 匯編源文件,還會(huì)進(jìn)行預(yù)處理,可以包含預(yù)處理指令
26 編譯鏈接的四個(gè)步驟:
預(yù)處理 gcc -E *.c -o *.i
編譯 gcc -S *.i -o *.s
匯編 gcc -c *.s -o *.o
鏈接 gcc *.o -o *.out
17 #include <> 會(huì)在系統(tǒng)目錄中查找?guī)煳募?/p>
#include "" 會(huì)現(xiàn)在用戶(hù)目錄中查找
18 靜態(tài)鏈接庫(kù)就是將自己的庫(kù)文件只編譯不鏈接形成的.o目標(biāo)文件,用ar工具歸檔成.a文件,使用時(shí),會(huì)將庫(kù)中的文件直接復(fù)制到使用它的文件中,若有多個(gè)文件include,就會(huì)復(fù)制多份到內(nèi)存中,造成內(nèi)存浪費(fèi)
靜態(tài)鏈接庫(kù)不是將庫(kù)文件直接復(fù)制到可執(zhí)行程序,只是做一個(gè)鏈接標(biāo)記,當(dāng)程序需要時(shí),加載到內(nèi)存中,其它程序也需要時(shí)直接使用,在內(nèi)存中只有一份
19 制作靜態(tài)鏈接庫(kù)
//demo.hvoid func1(void);int func2(int a,int b);//demo.c#include <stdio.h>void func1(){ printf("func1 in demo.c/n");}int func2(int a,int b){ printf("func2 in demo.c/n"); return a + b; }//test.c#include <stdio.h>#include "demo.h"int main(){ func1(); int a = func2(4,5); printf("a = %d/n",a); return 0;}制作靜態(tài)庫(kù):
gcc demo.c -o demo -c
ar -rc libdemo.a demo
1)使用命令gcc test.c -o test 會(huì)報(bào)錯(cuò)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
原因是沒(méi)有找到庫(kù)函數(shù)demo.a
2)使用命令 gcc test.c -o test -ldemo
ld: library not found for -ldemo
clang: error: linker command failed with exit code 1 (use -v to see invocation)
原因是默認(rèn)庫(kù)文件查找路徑為用戶(hù)動(dòng)態(tài)庫(kù)的文件夾
3)gcc test.c -o test -ldemo -L.
可以正確執(zhí)行,-L指定動(dòng)態(tài)庫(kù)的查找路徑 .表示當(dāng)前路徑
20 制作動(dòng)態(tài)鏈接庫(kù)
gcc -c demo.c -o demo -fPIC
gcc -o libdemo.so demo -shared
1)使用命令gcc test.c -o test 會(huì)報(bào)錯(cuò),同上靜態(tài)庫(kù)的錯(cuò)誤信息
2)使用命令 gcc test.c -o test -ldemo同上
3)gcc test.c -o test -ldemo -L. 可以
21 1)register關(guān)鍵字很少用,使用時(shí),系統(tǒng)會(huì)盡量把它分配到寄存器,效率會(huì)很高
但它沒(méi)有內(nèi)存地址,不能使用&符號(hào),而且不能保證每次都分配到寄存器,只能盡量
變量的長(zhǎng)度應(yīng)小于寄存器的長(zhǎng)度
22 在C中若變量從定義到使用始終未賦值,則在編譯和運(yùn)行雖然可以通過(guò),卻會(huì)得到意想不到的結(jié)果
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注