数据结构之malloc()函数动态内存分配复习
直接上代碼分析?
#include <stdio.h> #include <string.h> #include <malloc.h>int mian() {int a[5] = { 1,5,8,46,12 };int len;printf("請輸入你要分配數(shù)組的長度: len=");scanf("%d", &len);int * pArr = (int *)malloc(sizeof(int) * len); //為什么這里要使用強制類型轉(zhuǎn)化?//malloc函數(shù)返回的是第一個元素地址,//這個第一個元素地址是沒有意義的,因為double int char類型都一樣返回第一個元素地址,//程序無法知道這個第一個元素地址是什么類型的和占幾個字節(jié),//所以需要強制類型轉(zhuǎn)換告訴程序malloc函數(shù)返回的第一個元素地址的什么類型的*pArr = 4; //類似于 a[0] = 4;pArr[1] = 10; //類似于 a[1] = 10;}?int* pArr = (int*)malloc(sizeof(int)*len);?????????如果len占5個字節(jié)的話,那么 malloc(sizeof(int)*len)=20??個字節(jié), 20表示的是這個malloc函數(shù)請求操作系統(tǒng)要為我們的程序分配20個字節(jié)的空間,就是提供20個字節(jié)的空間來為我們程序進行讀寫.
?????????malloc函數(shù)只能返回第一個字節(jié)的地址,這個是系統(tǒng)規(guī)定的,第一個字節(jié)的地址沒有實際含義。因為不能根據(jù)第一個字節(jié)地址來確定這個變量占了幾個字節(jié)。因為整形變量占四個字節(jié),它也是以第一個字節(jié)地址來表示的,如果這個變量是double類型的話,它也是以第一個字節(jié)地址來表示的。無論這個變量占幾個字節(jié)它都是以第一個字節(jié)來表示的,所以malloc返回的第一個字節(jié)地址是沒有實際意義的地址(干地址)。所以我們需要在??malloc(sizeof(int)*len)??的前面加一個強制類型轉(zhuǎn)換??(int*)malloc(sizeof(int)*len)??來告訴我們的編譯器,我們返回的第一個字節(jié)地址到底是整型的地址,還是其他類型的地址。所以強制轉(zhuǎn)換成 int * 的話,那么我們的??pArr+1??的話那么它將會指向后面的一個 int * 的位數(shù),會指向后四位,如果強制類型是??double *??的話,??pArr + 1???將會指向后八位的地址。
?????????所以我們的??pArr??就等價與???a(數(shù)組,數(shù)組名表示首地址) , 因為a是指向了第一個元素,第一個元素就占了四個字節(jié)。???malloc(sizeof(int)*len)??這個分配了20個字節(jié),malloc返回第一個整型的地址,pArr也指向前四個字節(jié),pArr表示的是整型的地址。??那么??pArr + 1??就是指向了后四位了。
???????????那么??*pArr = 4;?????//類似于???a[0] = 4;
??????????????????????pArr[1] = 10;???//類似于a[1] = 10;
??????????????????????然后就導致了???pArr??表示前四位(第一個字節(jié))???
???????????????????????????????????????????????pArr + 1??就指向了后四位(一字節(jié))
?
?free(pArr); ? ?//把pArr所代表的動態(tài)分配的20個字節(jié)內(nèi)存釋放
總結(jié)
以上是生活随笔為你收集整理的数据结构之malloc()函数动态内存分配复习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。