动态内存分配到底为谁分配内存空间【浅谈动态内存的一个实例】
為了動(dòng)態(tài)的管理寶貴的內(nèi)存,許多程序中要使用到動(dòng)態(tài)內(nèi)存分配。一般情況下,在c語(yǔ)言中,使用malloc()函數(shù)來(lái)分配指定大小的內(nèi)存空間,用free()函數(shù)來(lái)釋放這塊內(nèi)存空間。但是,往往初學(xué)者在編寫這類程序時(shí)會(huì)出錯(cuò),而許多錯(cuò)誤是因?yàn)榈降诪檎l(shuí)分配了這塊內(nèi)存不清楚導(dǎo)致的。來(lái)看下面一段程序:
#include <stdio.h> #include <malloc.h>void main() {int i=100;int *p;p = (int*)malloc(sizeof(int));if (p == NULL) {printf("內(nèi)存分配不成功");} else {p=&i;printf("i=%d\n",i);printf("p=%d\n",*p);free(p);p=NULL;}while(1); }這段程序在編譯和連接時(shí)都不會(huì)出錯(cuò),并且也能在運(yùn)行時(shí)產(chǎn)生正確的結(jié)果,但是,最終會(huì)報(bào)出內(nèi)存錯(cuò)誤。這是為什么呢?
這段程序雖然嚴(yán)格遵從了malloc()函數(shù)和free()函數(shù)的使用規(guī)則,按照編寫者的意向,它是不會(huì)產(chǎn)生內(nèi)存錯(cuò)誤的,但是確實(shí)出現(xiàn)了內(nèi)存錯(cuò)誤,其根本原因就在于編寫者沒(méi)有明白分配的這塊內(nèi)存分配給了誰(shuí)!
編寫者可能認(rèn)為,這塊內(nèi)存分配給了指針p,也就是給p分配了一塊sizeof(int)大小的內(nèi)存空間,這恰恰是問(wèn)題的關(guān)鍵。因?yàn)檫@段程序并不是將sizeof(int)大小的內(nèi)存空間分配給了p,而是分配給了p指向的那塊內(nèi)存空間。而在上面的程序中,這塊內(nèi)存空間是存放int型的變量i的,而我們知道,int型的變量i是放在棧中的,而棧空間是由編譯器來(lái)分配的,而不是由程序員來(lái)分配的。既然不是由程序員分配的,那么它的釋放也就不由程序員來(lái)管理,而是由編譯器來(lái)管理的。這下明白了吧,程序員想管理一塊本來(lái)不歸自己管理的內(nèi)存空間,肯定會(huì)出現(xiàn)內(nèi)存錯(cuò)誤。
總結(jié)
以上是生活随笔為你收集整理的动态内存分配到底为谁分配内存空间【浅谈动态内存的一个实例】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 特斯拉降价到20万出头 网友忍不住要下单
- 下一篇: 英特尔 Sapphire Rapids