内存分配

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


static int s1=0,s2=0,s3=0;    //静态变量 放在静态区
int g1=0,g2=0,g3=0;           //全局变量 放在静态区
int a = 0;// 全局初始化区
char *p1;// 全局未初始化区
///C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Regeister).
void memery_allocation_and_sprintf()
{
    ///申请动态内存


    char *a=NULL; //声明一个指向a的char*类型的指针. //#include <stdlib.h> 或者 #include <malloc.h>
    a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a.(分配类型 *)malloc(分配元素个数 *sizeof(分配类型))
    sprintf(a,"%s","4788788");//"HelloWorld\n"写入a指向的地址
    printf("%s\n",a);//输出用户输入的数据
    free(a);//释放掉使用的内存地址.


///程序使用sprintf 将各种数据格式化后置于字符数组buffer中
    char  buffer[200], s[] = "computer";
    char c = 'a';
    int   i = 35, j=9;
    float fp = 1.7320534676;
    // 格式化并打印各种数据到buffer
    j=   sprintf( buffer,     "   String:    %s\n", s ); // C4996
    j += sprintf( buffer + j, "   Character: %c\n", c ); // C4996
    j += sprintf( buffer + j, "   Integer:   %d\n", i ); // C4996
    j += sprintf( buffer + j, "   Real:      %.4f\n", fp );// C4996
    printf("%s\n",buffer);


    /*
        1.
        分配128个int类型的空间:
        int *p;
        p = (int*)malloc(sizeof(int) * 128);
        //分配128个整型存储单元,相当于分配了可以放得下128个整数的内存空间.
        //并将这128个连续的整型存储单元的首地址存储到指针变量p中.


        2.
        sprintf( char *buffer, const char *format, [ argument] … );
        参数列表
        buffer: char型指针,指向将要写入的字符串的缓冲区。
        format: 格式化字符串.
        [argument]...:可选参数,可以是任何类型的数据。
        */
}


void stack_and_heap()
{


    static int s1=0, s2=0, s3=0;
    int v1=0, v2=0, v3=0;


//打印出各个变量的内存地址


    printf("0x %08x\n",&v1); //打印各本地变量的内存地址
    printf("0x %08x\n",&v2);
    printf("0x %08x\n\n",&v3);
    printf("0x %08x\n",&g1); //打印各全局变量的内存地址
    printf("0x %08x\n",&g2);
    printf("0x %08x\n\n",&g3);
    printf("0x %08x\n",&s1); //打印各静态变量的内存地址
    printf("0x %08x\n",&s2);
    printf("0x %08x\n\n",&s3);


    /*
    1.
    "0x%08x"
    "0x": 普通字符 配合显示16进制格式
    "%08x": 为整型以16进制方式输出的格式字符串, 8位对齐的16进制格式,少于8位则前补0.
    如 printf("0x%08x", 0x1234); 会输出 0x00001234.


    2. 这些变量在内存中都是连续分布的,
    3. 程序的内存分配
    一个由c/c++编译的程序占用的内存分为以下几个部分
    (1)、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  1.     (2)、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收.
         注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
    (3)、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
         未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
    (4)、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放.
         字符串常量:不能对值修改。常量:"abc" 、123、char *str = "abcdef"、"\n".
         字符串变量:能对值修改(可通过一个字符数组来体现)。变量:char c[] = "a"、char arr[] = "abc".
    (5)、程序代码区—存放函数体的二进制代码。


    . 形象比喻堆和栈:
    使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,
    不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
    使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。*/


    int b; //栈
    char s[] = "abc"; //栈
    char *p2; //栈
    // char *p3 = "123456"; //123456\0在常量区,p3在栈上。
    static int c =0; //全局(静态)初始化区
    p1 = (char *)malloc(10);//分配得来得10和20字节的区域就在堆区。
    p2 = (char *)malloc(20);
    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
    puts(p1);
    putchar('\n');
    puts(p2);




    static int s4=0,s5=0,s6=0;
    //<span style="font-family:Arial,Helvetica,simsun,u5b8bu4f53;">           </span>//静态变量
    int a1=0,a2=0,a3=0;
    //<span style="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"> </span>            //局部变量 放在栈区
    char c1[] = "aabb";            //局部变量 放在栈区
    char *c2 = "aabb";             //字符常量 放在静态区
    char *m1 = (char *)malloc(1);  // 堆区
    char *m2 = (char *)malloc(1);  // 堆区
    char *m3 = (char *)malloc(1);  // 堆区
    printf("动态数据区\n");
    printf(" a1\n a2\n a3\n",&a1,&a2,&a3);
    printf(" c1\n",c1);
    printf(" m1\n m2\n m3\n",&m1,&m2,&m3);


    printf("静态数据区\n");
    printf(" s1\n s2\n s3\n",&s1,&s2,&s3);
    printf(" g1\n g2\n g3\n",&g1,&g2,&g3);
    printf(" s4\n s5\n s6\n",&s4,&s5,&s6);
    printf(" c2\n",c2);
    /*
    电脑内存条有什么作用
      通俗的说内存条在电脑中的作用相当于一座桥梁,用以负责诸如硬盘、主板、显卡等硬件上的数据与处理器之间数据交换处理。
    所有电脑数据传输到处理器都是通过内存条与处理器进行传输处理的,可能有的朋友会想为什么数据不直接与处理器进行数据处理器与交换呢?
    其实大家只要了解内存就知道,内存的读取速度与存储速度是最快的,直接与主板上数据总线交换速度很慢,
    大家也可以将内存看作数据缓存区,拥有高速缓存区,也更有利于电脑处理数据的速度。




    内存条是CPU可通过总线寻址,并进行读写操作的电脑部件。我们通常所说电脑内存(RAM)的大小,即是指内存条的总容量。


    RAM有些像教室里的黑板,上课时老师不断地往黑板上面写东西,下课以后全部擦除。
    RAM要求每时每刻都不断地供电,否则数据会丢失。如果在关闭电源以后RAM中的数据也不丢失就好了,
    这样就可以在每一次开机时都保证电脑处于上一次关机的状态,而不必每次都重新启动电脑,重新打开应用程序了。
    但是RAM要求不断的电源供应,那有没有办法解决这个问题呢?随着技术的进步,人们想到了一个办法,
    即给RAM供应少量的电源保持RAM的数据不丢失,这就是电脑的待机功能,
    特别在Win2000里这个功能得到了很好的应用,休眠时电源处于连接状态,但是耗费少量的电能。


    ROM (只读内存(Read-Only Memory)简称)
    ROM是只读存储器(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器。
    其特性是一旦储存资料就无法再将之改变或删除。
    通常用在不需经常变更资料的电子或电脑系统中,并且资料不会因为电源关闭而消失。


    RAM为易失型随机存取存储器;
    ROM为非易失性只读存储器;*/
}
int main()
{
    stack_and_heap();
    memery_allocation_and_sprintf();


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值