• 【C补充】关于内存的分配问题


    /*
    
      1.C中的内存分配    
        
          栈:用来存放函数的形参和函数内的局部变量。
    
            结合汇编,我的理解就是函数的话,都是通过压栈,出栈来处理的。
    
    
          堆:用来存放由动态分配函数(如malloc)分配的空间。
          
            是由程序员手动分配的,并且必须由程序员用free手动释放。
            如果忘记free释放的话,会导致所分配的空间一直占着不放,
            导致内存泄漏。
    
    
            
              堆:数序随意
              栈:后进先出(LIFO)
    
           全局区(静态区):用来存放全局变量和静态变量
    
                            存在于程序的整个运行期间,是由
                            编译器分配和释放的。
            (全局静态存储区)
    
            文字常量区:
    
                    char *c = "123456";
                    则"123456"为文字常量,存放于文字常量区。
                    也是由编译器控制和释放。
    
    
    
            程序代码区:
    
    
    
    
      2、内存的分配方式
    
      内存分配方式有三种: 
      1)从静态存储区域分配。
      内存在程序编译的时候就已经分配好,
      这块内存在程序的整个运行期间都存在。
      例如全局变量,static变量。 
      2)在栈上创建。在执行函数时,
      函数内局部变量的存储单元都可以在栈上创建,
      函数执行结束时这些存储单元自动被释放。
      栈内存分配运算内置于处理器的指令集中,效率很高,
      但是分配的内存容量有限。 
      3)从堆上分配,亦称动态内存分配。
      程序在运行的时候用malloc或new申请任意多少的内存,
      程序员自己负责在何时用free或delete释放内存。
      动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
    
    
      一个指针被释放之后其内容并不是NULL,
      而是一个不确定的值。
      所以我们在编写程序释放一个指针之后一定要人为的将指针付成NULL.
      这样就会避免出现"野"指针的出现.
      有人说"野"指针很可怕,会带来意想不到的错误.
        
    
    
    */
    //虚拟内存
    /*虚拟内存->(映射到)物理内存->显卡
    
    io管理器
    电源管理器
    
      磁盘管理器: explorer, 磁盘分盘(一个程序) 簇,扇区,D:1.txt 应用程序的路径 
    
                    磁盘管理器转换HARDDISK volumu 2
    
                    内存->永久保存在磁盘上(通过接口)(标准接口函数)(标准C语言库fopen)
    
                    
    */
    
    
      File* (结构体指针)
    
        fopen()
        fclose()
    
      File* fp = NULL;
    
    
      fp = fopen(D:\1.txt,"r");
      if(fp == NULL) 
      {
        return;
      }
      读文件的时候一定要先判断
    
      fclose(fp);
    
        fgetc fputc //by Character
        fgets fputs //by stream                不灵活
        fread fwrite//by block   (readfile)    
    
      _CRTIMP size_t __cdecl fread(void *, size_t, size_t, FILE *);
    
    
    #include <stdio.h>
    
    void main( void )
    {
       FILE *stream;
       char line[100];
    
       if( (stream = fopen( "fgets.c", "r" )) != NULL )
       {
          if( fgets( line, 100, stream ) == NULL)
             printf( "fgets error
    " );
          else
             printf( "%s", line);
          fclose( stream );
       }
    }
  • 相关阅读:
    禁用LinkButton的方法
    Windows Server2008R2中导入Excel
    Viewport
    Firefox模拟手机访问手机网站
    关闭ReSharper中的[ Use 'var' ]提示(Disable C# “var” Recommendation in ReSharper)
    浏览器中如何获取想要的offsetwidth、、、clientwidth、、offsetheight、、、clientheight。。。
    JS中关于clientWidth offsetWidth scrollWidth 等的含义的详细介绍
    base64编码解码js
    scrollTop如何实现click后页面过渡滚动到顶部
    如何快速获取当前链接?后面的内容,location.search、页面滚动
  • 原文地址:https://www.cnblogs.com/Lee-geeker/p/3360440.html
Copyright © 2020-2023  润新知