【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\n" ); else printf( "%s", line); fclose( stream ); } }