進擊的小白 知識點 指標和malloc

2021-09-12 07:21:48 字數 2274 閱讀 1612

先來理解幾個概念:

指標的型別:指的是指標指向的變數(值)的型別,如定義乙個指標變數int *p = null,指標p指向乙個int型的變數,即指標的型別是int型。

指標指向的值的型別:與指標的型別相同,指標指向的值(變數)的型別就是指標的型別。

指標的值的型別:指標本身是乙個位址值,這個位址值對應的記憶體儲存著指標所指向的變數,而不管指標的型別(上面兩個概念)是什麼,指標變數本身的值(位址)的型別永遠都是unsigned int型。

int a = 0, *p;

p = &a;

p = &a;中,左邊(p)是指標變數,右邊(&a)是指標(位址)。

指標定義時分配的記憶體和用malloc分配的記憶體的區別:

定義指標時分配的記憶體是用來存放指標指向的變數的位址(指標變數本身的值)的,這個位址前面說過,是乙個unsigned int型,只有幾個位元組(幾個位元組由系統決定)。

用malloc是申請出一段記憶體,用來儲存資料,不是用來儲存指標本身的,malloc返回開闢出的記憶體的首位址,存放在被賦值的指標中,使指標指向這塊被開闢出來的記憶體。

什麼時候指標需要用malloc分配記憶體,什麼時候不需要

首先需要了解一下幾點:

c語言中,記憶體模型分為棧和堆,這兩種模型記憶體的方式是不同的。

在棧中存放的變數是由系統自動管理的,在函式結束後系統會自動釋放,不需要人為的任何操作。

在堆中存放的是使用者自己管理的記憶體,手動分配的,malloc建立,系統不會在函式體執行結束後自動釋放,需要使用者手動通過free函式釋放。

因此,當需要對分配的空間進行自己的管理和釋放時,需要實用malloc,或者分配的空間再函式結束後還需要存在。

這樣就有了「進擊的小白——知識點:函式返回指標的應該指向什麼變數」這篇博文中說的函式返回的指標應該指向什麼變數,其中有一條就是「專門申請分配的空間(如用malloc)」,因為malloc申請的空間在函式執行完畢後不會自動釋放。由於free後指標變數儲存的位址沒有改變,因此必須把指標變數的值變為null,否則會成為「懸空指標」。

free的作用

free執行的操作是:斬斷指標變數和這塊記憶體的對應關係。指標變數本身的值沒有改變或消失,即指標變數本身儲存的位址並沒有改變,那塊被釋放的記憶體裡面儲存的值也沒有改變,這是被釋放的記憶體裡儲存的值被稱為髒資料,可能維持原來的值,可能被清空,也可能被修改為其他的值。

關於記憶體洩漏

記憶體洩漏一般指的時堆記憶體,指程式從堆記憶體中分配出一塊記憶體,但使用完後沒有釋放,導致這塊內粗能不能再次使用。

首先了解一下c語言中記憶體分配情況,c語言中,根據資料在記憶體中存在的時間(生存週期)不同,講記憶體空間分為三個區:

程式區:用於儲存程式**,即程式的二進位制**。

靜態儲存區:用於儲存全域性變數和靜態變數,這些變數的空間在程式編譯時就已經分配好了。

動態儲存區:用於程式執行時分配的記憶體,又分為:堆區(heap)和棧區(stack)。堆區:用於動態記憶體分配,程式執行時由記憶體分配函式在對上分配記憶體,在c語言中,只能使用指標才能動態分配記憶體。棧區:在函式執行時,函式記憶體的區域性變數和函式引數的儲存單元的記憶體區域,函式執行結束時,這些記憶體區域會自動釋放。

在使用完開闢的記憶體後,及時使用free釋放這段記憶體,可以有效的避免記憶體洩漏。

使用malloc需要注意的幾點:

malloc返回的首位址時void *型的,因此在有指標接收這個首位址時,需要進行強制型別轉換,也就是說這塊記憶體將來需要用來儲存什麼型別的資料。

char *p = (char *)malloc(sizeof(char) * 100),這條語句的意思時在堆上分配了sizeof(char) * 100個位元組的記憶體,返回這塊記憶體的首位址,並把位址強制轉換成char *型,賦值給char *型的指標變數p,同時告訴我們這塊記憶體將用來儲存char型的資料。這塊記憶體只能通過指標變數p來訪問,這塊記憶體沒有名字,對它的訪問是匿名訪問。

當申請的記憶體塊大於堆中剩餘的記憶體塊時,會返回null,可以用if (p != null)來驗證記憶體分配是否成功。

free後,指標變數需要重新賦值成null,否則會成為「懸空指標」。

用malloc給指標分配一塊記憶體,然後用memset對這塊記憶體進行初始化,就可以像運算元組一樣直接操作指標:

int *p = null;

p = malloc(sizeof(int) * 10);

memset(p, 0, sizeof(int) * 10);

p[0] = 1;

p[1] = 2;

......

小白CSS知識點

1.static 靜態定位 這是頁面元素position屬性的預設值,元素將按照瀏覽器對網頁中元素的排列規則排列。2.relative 相對定位 相對自身原來位置的定位!如果以前沒有設定position或者position值為static,那麼設定relative後,元素的left,right,to...

指標知識點

指標定義 指標是乙個變數,儲存的內容為位址。int num 5 如果系統分配給num的空間為0x1000到0x1003 num的位址就為首位元組位址0x1000。0x1000內儲存的內容為5。定義指標p int p 指標p內儲存的內容為num的位址,如果系統給p分配的位址為0x2000,可以得到下圖...

指標知識點

1 一級指標 int p 2 二級指標 int p 3 多級指標 int p etcconst int p 指標常量 指標是乙個常量,必須初始化 int const p null 5 陣列指標和指標陣列 陣列指標 對二維陣列進行操作 int p n 陣列指標 儲存指標型別的陣列 int p n 6 ...