棧上陣列,做了什麼事?

2021-09-07 21:39:13 字數 839 閱讀 1848

考慮 char tmp[7] = "abcd";  做了什麼事?

2、tmp就是棧頂指標的別名,是個常量,不能修改指向。

3、從棧頂向高位址拷貝a,b,c,d,\0, 5個位元組,\0是"abcd"結尾隱含的位元組,陣列申請了7個位元組,剩餘的兩個位元組補充為\0, 第8個位元組為cc,沒有初始化。

4、陣列可以不定義長度,這種情況必須定義內容,由右邊的內容確定陣列的長度。char tmp="abcd"; sizeof(tmp)的長度就是5。如果不定義長度,並且不定義內容,編譯報錯 陣列名 unknown size

5、陣列定義長度,不定義內容,陣列的內容不初始化,取值為cc,連起來就是中文的燙字。

6、陣列定義長度,同時定義內容,內容長度小於陣列長度,缺少的部分使用\0初始化,注意:如果陣列定義的長度不是4的倍數,為了對齊,還會多挪出一些位元組,這些位元組不使用,為cc。

7、陣列定義長度,同時定義內容,內容長度大於陣列長度,編譯報錯:陣列名 array bounds overflow,陣列溢位。特別注意:char tmp[4]="abcd"; 也會溢位,因為"abcd"是文字字串,隱含乙個\0,實際長度是5。

8、特別注意:定義的陣列長度,除了包含實際的內容,還要至少多乙個位元組,用於儲存\0。否則,strlen,strcpy會出現問題。如下:

char tmp[4];

strncpy(tmp,"abcd",4);

int size = strlen(tmp); //size取值是不確定的,直到找到\0

因此,ip位址的陣列,應該是 char ip[16];或者ip[sizeof("255.255.255.255")],sizeof("255.255.255.255")的值不是15,而是16

什麼事快取

快取是cpu的一部分,它存在於cpu中 cpu訪問資料的速度非常的快,一秒鐘能夠訪問 處理十億條指令和資料 術語 cpu主頻1g 而記憶體就慢很多,快的記憶體能夠達到幾十兆就不錯了,可見兩者的速度差異是多麼的大 快取是為了解決cpu速度和記憶體速度的速度差異問題 記憶體中被cpu訪問最頻繁的資料和指...

今天 沒什麼事 這些天 都沒什麼事

久違了,可愛的小企鵝,闊別兩年多,今天終於又看到你熟悉的身影。這次安裝費時頗多,下了 兩個fc5都沒順利讀出來,索性回到redhat 9吧,瞧著都面熟。本子的空間太侷促,所以連gnome 也沒裝,只好委屈一下了,等下次撿到錢,一定換個大硬碟。想起昨晚西門雞翅大餐回來,三個人在園子裡飆車,感覺甚爽,白...

什麼事obj檔案

程式編譯時生成的中間 檔案。目標檔案,一般是程式編譯後的二進位制檔案,再通過鏈結器 link.exe 和資源檔案鏈結就成可執行檔案了。obj只給出了程式的相對位址,而可執行檔案是絕對位址。1 這個問題不是很簡單,你只看到了檔案從源 到exe檔案這個流程中的一小部分。要詳細的深究這個問題,需要很多時間...