C語言基礎之 記憶體位址分配

2021-07-03 19:07:37 字數 2944 閱讀 1765

一.記憶體劃分:(位址由高到低)

1.棧區

棧區的資料以棧的形式進行儲存,特點:先進後出

函式體內存放的區域性變數存放在棧區,由系統分配空間和系統釋放.

開發人員不需要關心如何為區域性變數分配空間.

int a = 10;

printf(「%p\n」,&a);

2.堆區由開發人員手動申請,手動釋放,唯一一塊由開發人員操作的區域.

1⃣申請記憶體的函式

void *malloc(size_t);

返回型別為:void *,泛型類,可以轉化為其他型別.

malloc 為函式名, size_t 為引數, unsigned long 型別的引數,也就是傳入的位元組數

在堆區里申請4個位元組的空間,返回的是申請空間的首位址.

int *p = malloc(4);

申請了4個連續位元組,放100;

*p = 100;

printf(「%p\n」,p);

printf(「%d\n」,*p);

在堆中」iphone」,多出乙個位元組,存放』\0』,為了安全

char *p1=malloc(7);

strcpy(p1,」iphone");

// 將第三個字母改為』\0'

*(p1+2) =『\0』;

strcpy((p1+2),」abcd");

printf(「%s\n」,p1);

記憶體洩露:一塊記憶體一直被占用著,而得不到釋放.

記憶體釋放的函式

void free(void *);

free(p1);// 把對應的儲存空間,置為可用狀態

p1 = null;//把指標置為空

3.靜態區

靜態區也叫全域性區,定義在函式外面的變數存放在全域性區,使用關鍵字 static 修飾的變數也存放在靜態區.由 static 修飾的和全域性變數都是存放在靜態全域性區.靜態區里的是資料也是由系統進行分配和釋放空間.

由 static 修飾的變數特點:

1⃣被 static 修飾過的變數,存放在靜態區;

2⃣被 static修飾的變數只會被初始化一次;

3⃣由 static 修飾變數沒有初始化,系統預設為0;

static int a = 20;

for(int i = 0;i < 40;i++) 列印的結果:n = 0,1,2,3,4,5..

static int n;

printf(「%d\n」,n); n =0

4.常量區

常量(10,2,3.2,』c』,」lan ou」); 都存放在常量區

常量由系統分配空間和釋放空間的.

常量區的資料只能讀,不能改.

5.**區

程式中執行的函式和語句都會編譯成cpu 指令存放在**區.

函式名的存放就是函式在**區的首位址.

也是有系統分配空間和釋放空間.

6.動態記憶體申請的其他函式

1⃣void calloc(count,size)

和 malloc 一樣,申請記憶體空間,但是申請的記憶體空間,會做乙個清空的操作;由於多了這一步,效率比malloc低;

count 個數  size 大小(位元組個數)  calloc申請的總位元組數: count *size

返回值也是申請空間的首位址

int *p = calloc(20,4);

free(p);

p6 = null;

2⃣申請的其他函式realloc

realloc(*p,size); 從指標 p 的 位置開始,重新申請(size)多少個位元組

int *p7 = malloc(2);

printf(「%p\n」,p7);

從 p7的位置申請,如果後面有 size 個連續位元組的話,就直接申請;如果後面沒有的話,就重新找一塊 size 位元組空間,找到的話就申請,並且把之前申請的位元組進行釋放,指標會重指向.

p7  = realloc(p7,40000);

printf(「%p\n」,p7);

free(p7);

p7 = null;

3⃣void memset(*p,c,size_t n);

從指標 p 開始初始化 n 個位元組的記憶體,並把內容改為 c

int *p8 = malloc(4);

printf(「%d\ n」,*p8);

memset(p8,8,3);

printf(「%d\n」,*p8);

char *p9 = malloc(4);

memset(p9 ,』b』,1);

printf(「%s\n」,p9);

4⃣記憶體拷貝函式( 跟字串拷貝函式的用法基本一致)

void *memcpy(void *dest,const void *source,size_t n);

從 source 指向的記憶體開始拷貝到 dest, 拷貝 n 個位元組

從 source 的位置開始,向 dest 的位置,拷貝n個位元組

char str = 「abc」;

char straight = 「123」;

memcpy(str,str1,3);

printf(「%s\n」,str);

5⃣記憶體比較

int memcmp(const void *buf1,const void *buf2,unsigned int count)

比較 buf1和 buf2指向的記憶體是否相同,比較 count 個位元組.

比較p1和p2 指向記憶體裡的內容是相同的,比較 n 個位元組,返回0,.相等.不同的時候返回差值

int *p_10 = malloc(4);

*p_10 = 108;

int *p_11 = mallioc(4);

*p_11 = 3;

int result = memcmp(p_10,p_11,1);

printf(「%p\n」,result);

記憶體位址分配

inti 1 intj 1 cout i endl j endl 2 函式引數列表的存放方式是,先對最右邊的形參分配位址,後對最左邊的形參分配位址。3 little endian模式的cpu對運算元的存放方式是從低位元組到高位元組的 0x1234的存放方式入下 0x4000 0x34 0x4001 ...

C 記憶體位址分配簡介

1 棧中的變數,其記憶體位址是從高位址到低位址進行分配的 int i 1 int j 1 cout i float pf new float 1.1 cout 2 函式引數列表的存放方式是,先對最右邊的形參分配位址,後對最左邊的形參分配位址。3 little endian模式的cpu對運算元的存放方...

C語言記憶體位址基礎(ZZ)

從計算機記憶體的角度思考c語言中的一切東東,是挺有幫助的。我們可以把計算機記憶體想象成乙個位元組陣列,記憶體中每乙個位址表示 1 位元組。比方說我們的電腦有 4k 記憶體,那這個記憶體陣列將會有 4096 個元素。當我們談論乙個儲存位址的指標時,就當相於我們在談論乙個儲存著該記憶體陣列某個元素索引的...