指针的强制类型转换和动态分配内存

时间:2021-10-03 19:46:21
C里面使用自动分配内存,比如说malloc分配*存取区,就把它当作是在堆上分配的了,
他的好处是可分配的内存更大更灵活,理论上可以分配用户空间能使用的所有虚拟内存空间,
它是通过链式分配的,比如说有这样的一个语句 :
int *p=(int *)malloc(sizeof(int))
意思是,先在栈上创建一个int类型的指针变量,再在堆上分配4个字节大小的空间<32位>,再把创建的内存首地址赋给p。
在上面这个题目中,p是在栈上分配的,就是所谓的自动动分配,最多能分配的好象是1M空间的大小,有的说是2M。正因为在堆上 分配的它不可以自动回收内存,所以要显试的调用free()来收回内存,还有就是如果p是局部变量的时候,一定要在p的作用域内调用free(),因为p 是在栈上分配的,一但清栈之后p的作用域没了,这个时候你要是想在其他地方调用free就没效果了,这个就象链表的头指针丢失 。
当你学C++的时候,研究一下new和malloc吧

(int*)意思是把后面的数据强制类型转换成整型的指针类型。

malloc(sizeof(int))在堆上开辟一个4个字节的存储空间,并返回空间的首地址。

手动分配内存的好处是可以实现内存的动态分配和回收。 
因为如果使用静态分配,在编写程序时,很难预测变量使用量。比如说链表等数据结构,很难在编写程序时知道链表的长度,所以静态分配内存要么浪费资源,要么分配的不够。在使用某些递归算法时,更需要手动分配内存,否则就会像狗熊掰棒子一样只剩下最后一个了。 
手动分配内存一定要注意回收。否则就会造成内存泄露

静态分配是自动的
存在栈上的数据是静态分配的 存在堆上的数据是动态分配的,堆是*存储区。
栈是先进后出(FILO)适合用于静态分配,计算机用来自动分配。