linux c 記憶體管理(二)

2021-05-21 22:24:09 字數 1878 閱讀 5415

3.

指標與陣列的比較

不同點:

陣列:要麼在驚天儲存區域被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命週期內保持不變,只有陣列的內容可以改變。

指標:可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。

兩者特徵比較的例子:

(1)

修改內容:

char a = 「hello」;

a[0] = 『x』 ; // ok

char *p = 「hello」; //注意p

指向常量字串

p[0] = 『x』; //

錯誤。編譯器不能發現該錯誤指標p

指向常量字串

」hello」(

位於靜態儲存區,內容為

hello)

,常量字串的內容是不可以被改變的。企圖修改常量字串的內容而導致執行錯誤。

(2)

內容複製與比較

不能對陣列名進行直接複製與比較,陣列間複製應該使用標準函式

strcpy

進行複製。同理,比較b和

a的內容是否相同,不能使用

if( b == a )

來判斷,應該使用標準庫函式

strcmp

進行比較。

語句p = a

並不能將陣列

a的內容複製給指標

p,而是把

a的位址賦給了

p,要想複製

a的內容,可以先用庫函式

malloc為p

申請一塊容量為

strlen(a) + 1

個字元的記憶體,再用

strcpy

進行字串複製。同理,

if( p == a)

比較的不是內容而是位址,應該用庫函式

strcmp

比較。//

陣列char a = 「hello」;

char b[10];

strcpy( b, a); //

不能用if( b == a)

…….// 指標

int len = strlen(a);

char *p = (char *)malloc( sizeof(char) * ( len + 1) );

strcpy( p, a); //

不能用p = a;

if( strcmp( p, a ) == 0 ) //

不能用if( p == a )

…….(3)

計算記憶體容量

用運算子

sizeof

可以計算出陣列的容量(位元組數)。

下例中,

sizeof (a)

的值是12

(注意別忘記了

』』)。指標p指向

a,但是

sizeof(p)

的值卻是

4(32

位計算機

),這是因為

sizeof(p)

得到的是乙個指標變數的位元組數,相當於

sizeof(char *)

,而不是

p所指的記憶體容量。

注意:當陣列作為函式的引數進行傳遞時,改陣列退化為同型別的指標。

char a = 「hello」;

char *p = a;

cout << sizeof(a) << endl; // 12

位元組cout << strlen(a) << endl; // 11

位元組cout << sizeof(p) << endl; //4

位元組cout << strlen(p) << endl; // 11位元組

void func(char a[100]) //

陣列退化為指標

linux C複習 記憶體管理

1 虛擬記憶體位址 每個程序都有4g的虛擬記憶體位址,當程序需要真正的物理空間時,向系統申請,系統會分配給程序相應的物理記憶體空間。系統會將程序的一部分虛擬記憶體位址和分配好的物理記憶體之間一 一對應起來,這個過程叫記憶體對映。2 產生段錯誤的原因 1 當程式訪問或修改沒有許可權訪問或修改的記憶體空...

Linux C程序管理之訊號 共享記憶體

訊號的本質 訊號是在軟體層上對中斷機制的一種模擬。kill alarm 等函式 訊號種類 訊號分為可靠訊號和不可靠訊號 unix系統只定義了 32種訊號,red hat 支援64 種訊號,訊號大於 32 64 的為可靠訊號,其餘為不可考訊號 我主要想給大家介紹的是下面的關於訊號的幾個函式 1.kil...

記憶體管理二

發現兩篇記憶體池的博文,博文位址如下,寫的很好,能避免記憶體碎片和記憶體洩露問題,比我這個玩具 要好很多,大家可以看看 在我們做專案的時候,經常會分配了記憶體,然後卻忘了釋放,造成記憶體洩漏的問題。以下 可以實現在 退出的時候自動釋放之前申請但未釋放的記憶體。其原理是 用乙個雙向鍊錶維護申請的記憶體...