一.記憶體劃分:(位址由高到低)
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 個元素。當我們談論乙個儲存位址的指標時,就當相於我們在談論乙個儲存著該記憶體陣列某個元素索引的...