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

/**
 *
 *  bss段的变量
 *  没有初始化的和初始化为0的全局变量和静态变量,bss类型的全局变量只占运行时的内存空间,而不占文件空间。
 *
 */
int num_bss_1;
int num_bss_2 = 0;
static int num_bss_3;

/**
 *
 *  .data段的变量
 *
 */
int num_data_1 = 123;
static int num_data_2 = 123;

void stack()
{

    /**
    *
    *   stack 栈区申请的字符串
    *
    */
    char stack[] = {'s','t','a','c','k','\0'};
    printf("%s\n",stack);

}

void heap(char *heap)
{
    /**
    *
    *   heap 堆区申请的字符串
    *   显示申请动态内存
    */
    heap = malloc(sizeof(char)*5);
    heap[0] = 'h';
    heap[1] = 'e';
    heap[2] = 'a';
    heap[3] = 'p';
    heap[4] = '\0';
    printf("%s\n",heap);

}

void rodata()
{
    /**
    *
    *   .rodata 段申请的字符串
    *
    */
    char *rodata = "rodata";
    printf("%s\n",rodata);
    // printf("rodata\n");
}

int main()
{

    rodata();

    stack();

    /**
    *
    *   1、显示释放动态内存
    *   2、如果不释放堆区的内存,之后仍可继续访问
    *   3、使用前后都需要指向NULL,避免悬空指针
    */
    char *heap_point = NULL;

    heap(heap_point);
    free(heap_point);
    //printf("%s\n",heap);
    // 好习惯
    heap_point = NULL;

    return 0;
}


备份地址: 【分析一段程序内存segment分配