c是怎么使用内存的

指针类型(point type)可由函数类型,对象类型或不完全的类型派生,派生指针类型的类型称为引用类型。指针类型描述一个对象,该类对象的值提供对该引用类型实体的引用。有引用类型T派生的指针类型有时称为“(指向)T的指针”。从引用类型构造指针类型的过程称为“指针类型的派生”。这些构造派生类型的方法可以递归的应用。

对指针加N,指针前进“当前指针指向的数据类型的长度*N”

空指针是指可以确保没有指向任何一个对象的指针。他和任何非空指针进行比较都不会相等,因此常用作函数发生异常时的返回值使用。

fflush()是对输出流使用的,他不能用于输入流。标准中并没有定义用于输入流的fflush()的行为。

静态存储期,全局变量,文件内的static宾亮,指定static的局部变量都持有静态存储期,这些变量也称为静态变量。它的寿命从程序运行开始,到程序关闭结束。换句话说,静态变量一直存储在内存的同一地址上

自动存储期,没有指定static的局部变量,称为自动变量。在进入他所在的语句时被分配内存,语句结束后内存释放

通过malloc()分配的领域,寿命到free()为止

自动变量重复使用内存区域,因此自动变量的地址是不一定的。

c语言中通常将自动变量保存在栈中。内存区域可以被重复利用,节约内存。可以实现递归调用。

在调用函数时,参数从后往前按顺序被堆积在栈中。

malloc()根据参数指定的尺寸来分配内存块,他返回指向内存块初始位置的指针,经常被用于动态分配结构体的内存领域,分配前不知道大小的数组的内存领域等。

1
2
p = malloc(size)
free(p)

像这样能够动态进行内存分配,并且可以通过任意的顺序释放的记忆区域,称为堆(heap)

malloc()不是系统调用

malloc()是通过链表来实现的,malloc()遍历链表寻找空的块,如果发现尺寸大小能够满足的块,就分割出来将其变成使用中的块,并向应用程序返回紧邻管理区域的后面区域的地址。free()将管理区域的标记改写成空块,顺便将上下空的块合并成一个块,这样可以防止块的碎片化。
如果不存在足够大的空块,就请求操作系统对空间进行扩容,unix下使用brk()系统调用。
malloc()绝对不是魔法函数。