一、C中内存分配情况
    1、程序代码区:存放程序的二进制文件。
    2、常量区(只读区):由编译器控制和释放,程序结束后释放;例如:char *str = "123456","123456"就存放在这个区。
    3、全局区(静态区),全局变量和静态变量(包括全局和函数局部)都存放在这个区,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和未初始化的静态变量存放在相邻的另一块区域;程序结束时释放。
    4、栈区:存储的是函数局部变量,函数形参、函数返回值,由编译器自动分配;函数执行完后由编译器释放。
    5、堆区:由程序员手动分配(如malloc函数,free函数释放),若程序员不释放,程序结束后由操作系统回收。

示例代码:
#include <stdio.h>

char ch;//全局(静态)未初始化区
char *str = "123456";//指针变量str在全局(静态)初始化区,"123456"在常量去(只读区)
char s[] = "123456";//数组s在全局(静态)初始化区,里面保存的是'1'~'6','\0'七个字符。

void main(void)
{
    int a;//栈区
    char *p;//栈区
    char *p1 = "123456";//指针变量p在栈区,"123456"在常量去(只读区)
    static int b = 0;//全局(静态)初始化区
    char *str = (char *)malloc(10);//堆区
}

二、C++内存分配情况
    1、程序代码区:存放程序的二进制文件。
    2、常量区(只读区):由编译器控制和释放,程序结束后释放;例如:char *str = "123456","123456"就存放在这个区。
    3、全局区(静态区),全局变量(初始化和未初始化的)和静态变量(包括全局和函数局部以及初始化和未初始化的)都存放在这个区;程序结束时释放。
    4、栈区:存储的是函数局部变量,函数形参、函数返回值,由编译器自动分配;函数执行完后由编译器释放。
    5、堆区:由程序员手动分配(如new分配,delete释放),若程序员不释放,程序结束后由操作系统回收。
    6、自由存储区:由程序员手动分配(如malloc函数,free函数释放),若程序员不释放,程序结束后由操作系统回收。

示例代码:
#include <stdio.h>

char ch;//全局(静态)未初始化区
char *str = "123456";//指针变量str在全局(静态)初始化区,"123456"在常量去(只读区)
char s[] = "123456";//数组s在全局(静态)初始化区,里面保存的是'1'~'6','\0'七个字符。

int main(void)
{
    int a;//栈区
    char *p;//栈区
    char *p1 = "123456";//指针变量p在栈区,"123456"在常量去(只读区)
    static int b = 0;//全局(静态)初始化区
    char *str = (char *)malloc(10);//堆区
    int *p2 = new int[5];//自由存储区

    return 0;//0存储在栈区
}