【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 );
   }
}
原文地址:https://www.cnblogs.com/Lee-geeker/p/3360440.html