C語言一些常用記憶體分配函式

2022-02-21 16:39:54 字數 1611 閱讀 1509

首先看個問題程式(這裡用的是tc編譯器):

#include "stdlib.h"

#include "stdio.h"

void main()

輸出的結果是:

8fc|1

8fe|2

這個程式編譯通過,執行正常,說它有問題,問題出在哪呢?

首先通過malloc,建了乙個大小為2的堆,

i指向的位址是8fc,i+1指向的位址是8fc+sizeof(int)=8fe

但是位址8fe是不受保護的,因為它不是機器分配給i+1的,隨時會被其他變數占用。

正確的做法是

#include "stdlib.h"

#include "stdio.h"

void main()

realloc

可以對給定的指標所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有記憶體的中內容將保持不變。

當然,對於縮小,則被縮小的那一部分的內容會丟失。

realloc

並不保證調整後的記憶體空間和原來的記憶體空間保持同一記憶體位址。但是會盡量去在原來的基礎上擴容。當原來的空間不足以容納的時候會在新的記憶體擴容且把原來的資料遷移過去,但是要記得top指標的改變。

相反,realloc 返回的指標很可能指向乙個新的位址。

所以,在**中,我們必須將realloc返回的值,重新賦值給 p :

p = (int *) realloc (p, sizeof(int) *15);

甚至,你可以傳乙個空指標(0)給 realloc ,則此時realloc 作用完全相當於malloc。

int* p = (int *) realloc (0,sizeof(int) * 10); 

//分配乙個全新的記憶體空間,

這一行,作用完全等同於:

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

『附註:tc編譯器裡sizeof(int)=2,vc裡面sizeof(int)=4;

char型在兩個編譯器裡是一樣的,都是1個位元組(8位)』

calloc與malloc相似,引數nelem為申請位址的單位元素長度,elsize為元素個數,如:

char* p;

p=(char*)calloc(sizeof(char),20);

這個例子與上乙個效果相同

realloc

可以對給定的指標所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有記憶體的中內容將保持不變(free掉)。

當然,對於縮小,則被縮小的那一部分的內容會丟失。

realloc 並不保證調整後的記憶體空間和原來的記憶體空間保持同一記憶體位址。相反,realloc 返回的指標很可能指向乙個新的位址。

所以,在**中,我們必須將realloc返回的值,重新賦值給 p :

p = (int *) realloc (p, sizeof(int) *15);

個人總結起來其實realloc函式就兩點:

realloc 並不保證調整後的記憶體空間和原來的記憶體空間保持同一記憶體位址。但是會盡量去在原來的基礎上擴容。當原來的空間不足以容納的時候會在新的記憶體擴容且把原來的資料遷移過去,但是要記得top指標的改變。

原有記憶體的中內容將保持不變(free掉),也就是說不用手動去free掉

關於C語言變數記憶體分配一些自己的理解。

以下僅僅是自己通過看書後的,自己的一些理解,有什麼問題歡迎指出。首先說下記憶體,什麼是記憶體,什麼是位址?打個比方,把記憶體比作一棟樓,這棟樓裡面有很多房間,每個房間都有標號。那麼,每個房間裡面的空間就是我們存放東西的地方,房間的標號就是我麼所說的位址。如果我們想要在這棟樓拿出乙個東西,那麼得首先知...

C語言 關於系統記憶體分配機制的一些整理

指向字串常量的指標和字串陣列在使用時是有區別的。看下面兩個函式 執行通過,返回 hello world char ptrchar 執行錯誤,不能返回區域性變數 char arrchar 出現上面的原因在於指標pc指向的字串 hello world 存放在文字常量區,而陣列ac中存放的字串存放在棧區,...

c語言動態分配記憶體及記憶體分配部分函式

include 在c中動態分配記憶體的基本步驟有 1,用malloc類的函式分配記憶體 2,用這些記憶體支援應用程式 3,用free函式釋放記憶體 二 動態記憶體分配函式 malloc 從堆上分配記憶體 realloc 在之前分配的記憶體塊的基礎上,將記憶體重新分配為更大或者更小的部分 calloc...