这个星期我大部分精力都花在了啃指针上。这篇文章对指针中动态内存分配方面做了简单介绍
一,计算机内存的类型:
这张图中,内存大体被分为4个部分,code部分是用来储存程序的指令,static部分是用于储存静态变量和全局变量的,而static也就是栈,在我的理解下,栈是用来储存函数的,函数从栈顶向下执行,每一个函数被分为一个个的栈帧,在函数执行完之后,栈帧会给自动删除。我觉得栈和heap也就是堆最大的区别就是,堆是一个我们可以自由分配的内存空间,我们可以根据需要来在堆中开辟内存(前提是不超过系统本身的设置)。而堆的内存是有限的,如果函数使用不当发生无限递归可能会导致栈溢出。所以堆就是后面动态内存分配的主角。
二,怎么进行分配和三个进行内存分配的函数
在栈中定义一个指针变量,让这个使用动态内存分配的函数在堆上开辟一个空间,让这个指针变量指向这块内存的首地址。
后面说一下进行内存分配的三个函数 malloc calloc realloc:
malloc:下面是使用的形式
int *p; p = (int*)malloc(n*sizeof(int));
因为malloc只是开辟内存,这个内存可以拿来储存字符,整形,没有限制,所以要在malloc前面加上一个类型转换。malloc括号中就是开辟内存的大小。
calloc:下面是使用的形式
int*p; p = (int*)calloc(n,sizeof(int));
calloc和malloc似乎是一样的但是还是有不同的,第一个就是使用形式上的不同,malloc直接在后面加上所需内存的大小,而calloc后面的两个参数分别是几个内存单位,已经每一个内存单位的大小(不知道这样说准不准确)。第二个就是初始化的问题,malloc开辟内存的同时若没有进行初始化,分配出的内存就是一片随机值。但是calloc所开辟出来的内存会被初始化为0。
realloc:
int *p; p = (int*)malloc(n*sizeof(int)); int *p0; p0 = (inr*)realloc(p,2*n*sizeof(int));
这个函数可以让内存空间翻倍或者减半。使用形式 realloc(原内存块,新内存块大小)。系统会申请一块新的内存块大小,然后把原内存块的内容复制到新内存块的位置,然后释放原内存块的内存。但是新块的内存要大于原来块的内存。如果两个内存块有连接的部分,则将两个内存块连接起来。
realloc还有一些其他应用如:
int *b = (int*)realloc(NULL,n*sizeof(int));
这个代码就相当与malloc。相当于在内存中分配一些空间。