C 内存分区
一.棧區:
1.局部變量的生活在棧區(不管函數還是主函數內)
2.生命周期:
①定義變量的時候開始(開辟內存空間)
②所在作用域結束的時候消亡(被系統回收)
注:存在回收不及時的問題
二.堆區
1.動態申請空間
注:在不用的時候 需要手動釋放 不會隨著作用域的結束釋放掉
2.兩個相關函數:
①調用函數必須使用的頭文件:#include<stdlib.h>
②申請空間:malloc();
例如:
1 int* p = (int*)malloc(4);需要注意的是:雖然申請了四個字節 但是返回的是申請空間的首地址
返給我們的是一個void類型的指針(即void* 泛型指針) 或空
malloc申請的空間是連續的 動態創建
例題:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main() 5 { 6 int* p = (int *)malloc(2*sizeof(int)); 7 p[0] = 1; 8 p[1] = 2; 9 printf("%d %d\n",*p,*(p+1)); 10 return 0; 11 }結果為1 2
③釋放空間:free();
注:放的是申請空間的首地址
例題:在上面例題的代碼的第8行下面 如果加上一句free(p+1); 結果是會報錯的
因為它回收了不屬于自己的內存空間 不僅回收了p[1]的空間 它后面的4個字節也會被回收
這里需要注意的是:free釋放也只能釋放一次 也可以free(NULL); 但是這是沒意義的
1 free(p); 2 p = NULL;注:free完了一定要跟著p = NULL;
④生命周期:
malloc出生(分配空間)
free消亡(空間回收)
三.全局/靜態區
1.引入:在主函數中定義一個a 但是在功能函數中 讓a=10
這樣是不可以的 因為作用域不同 不在一個作用域內
2.全局變量:
①定義:在頭文件和主函數之間
例如:
1 int g_a;注:如果在主函數中 直接調用(沒有初始化) 輸出結果為0(即默認初始化為0)
全局變量在主函數中是認識的 在功能函數中也是認識的 可以在主函數或者自己定義的函數中對其進行讀寫
②作用域:整個文件
可見范圍:整個文件都可見
③生命周期:運行時就有 結束時消亡
先聲明 后使用 外部只可以作聲明 不能對其進行操作
了解:多文件可用 可以跨文件使用 但是需要在其他文件中進行外部引用
3.靜態變量:
①定義:
1 static int i = 1;注:靜態變量在內存中 只存一份(只能聲明一次) 默認初始化為0
②作用域:只在聲明的作用域內有效
③生命周期:程序結束才能被回收
注:只是此文件可見
4.總結:全局變量和靜態變量就存在全局/靜態區
所以不會隨著作用域的結束而被回收 是隨著程序走的
全局/靜態區 包括:
①數據段:放已經被初始化過的全局變量/靜態變量
②BSS:放未被初始化的全局變量/靜態變量
這里放一道例題加深對全局變量和靜態變量的例題:
1 #include<stdio.h> 2 3 void AA(); 4 5 int a; 6 7 int main() 8 { 9 AA(); //輸出1 10 AA(); //輸出2 11 AA(); //輸出3 12 13 printf("%d\n",a); //輸出0 14 a = 10; 15 printf("%d\n",a); //輸出10 16 17 return 0; 18 } 19 20 void AA() 21 { 22 static int i = 0; 23 i++; 24 printf("%d\n",i); 25 }四.字符常量區
1.字符串:
①定義:以“\0”結尾的字符數組
注意:\0 ?0 ?'0' 三者的區別
\0在ASCⅡ碼表中對應的數字就是0(\0 === 0)
'0'(字符0)在ASCⅡ碼表中對應的值為48
②聲明字符串的方法:
第一種:在棧區聲明一個字符數組 并且初始化(可改)
1 char str[5] = {'a','b','c','d','\0'}; 2 printf("%s\n",str); //輸出的時候放的是首元素的地址第二種:在棧區聲明一個字符數組 從字符常量區中拷貝一份復制(可改)
1 char str1[5] = "abcd";第三種:在棧區聲明一個char型指針 指向字符常量區的字符串(不可改)
1 char* str2 = "abcd";2.字符常量區:
“ “里面的字符串都存在字符常量區中
字符常量區包含代碼區(也就是說 我們打的代碼都存在這里)
例題:輸出函數練習
1 #include<stdio.h> 2 3 int MyPrint(char* str); 4 5 int main() 6 { 7 char* str = "abcd"; 8 MyPrint(str); 9 10 return 0; 11 } 12 13 int MyPrint(char* str) 14 { 15 int count = 0; 16 if(*str == NULL) 17 { 18 return -1; 19 } 20 while(*str != '\0') 21 { 22 printf("%c ",*str); 23 *str ++; 24 count ++; 25 } 26 27 return count; 28 }?
轉載于:https://www.cnblogs.com/Aaaaaalei0612/p/8728649.html
總結
- 上一篇: dede使用心得
- 下一篇: Git 学习第二天(一)