国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

關(guān)于C的一些小知識(shí)點(diǎn)

2019-11-08 02:06:17
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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é)果

    


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 恩平市| 灌云县| 长海县| 汝阳县| 海门市| 象山县| 罗源县| 饶阳县| 炉霍县| 客服| 噶尔县| 农安县| 蕲春县| 象山县| 瑞金市| 东山县| 专栏| 筠连县| 赣州市| 麦盖提县| 广平县| 新巴尔虎右旗| 乾安县| 通山县| 盐源县| 阿瓦提县| 茶陵县| 图木舒克市| 揭西县| 洞口县| 菏泽市| 利川市| 遂川县| 东辽县| 梅河口市| 青岛市| 淮阳县| 三穗县| 平顺县| 台州市| 商丘市|