日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C 内存分区

發布時間:2025/7/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的C 内存分区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。