指针与动态内存分配的简单总结

这个星期我大部分精力都花在了啃指针上。这篇文章对指针中动态内存分配方面做了简单介绍

一,计算机内存的类型:

指针与动态内存分配的简单总结

 

这张图中,内存大体被分为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。相当于在内存中分配一些空间。

 

上一篇:#内存泄露# #mtrace# mtrace


下一篇:记录学习C语言第十一次