C語言中是如何進行內存分配的?

預備知識

一個由C/C++編譯的程序佔用的內存分爲以下幾個部分:

  • 棧區(stack):由編譯器自動分配與釋放,存放函數運行時的局部變量、函數參數、返回數據、返回地址等。

  • 堆區(heap):由程序員自動分配與釋放,用malloc函數申請內存,用free函數釋放內存。

  • 全局區(靜態區static):全局變量和靜態變量的存儲是放在一塊的,內存分配在程序編譯之前完成,且在程序的整個運行期間都存在。全局區分爲已初始化全局區(data)和未初始化全局區(bss)。

  • 文字常量區:存放常量字符串。

  • 程序代碼區:存放函數體的二進制代碼。

內存圖解

在這裏插入圖片描述

示例代碼

#include <stdio.h>
#include <stdlib.h>

int i = 0;//全局已初始化區
int j;    //全局未初始化區

static int x =0;//全局已初始化區
static int y;   //全局未初始化區

void main() {
    int a;  //棧區
    int *pa;//棧區

    int *p1 = (int *) malloc(20);//堆區
    int *p2 = (int *) malloc(40);//堆區

    char *s1;//棧區
    char s2[] = "Hello World";//棧區
    char *s3 = "Hello World";//*s3:棧區    Hello World\0:文字常量區

    static int x =0;//全局已初始化區
    static int y;   //全局未初始化區

    printf("main:0x%p\n",main);//main函數的二進制代碼在程序代碼區
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章