/*
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 );
}
}