二維指針動(dòng)態(tài)分配內(nèi)存連續(xù)問題深入分析
首先,小編先貼出測(cè)試代碼:
#include <cstdlib>
#include <iostream>
using namespace std;
#define nWidth 3
#define nHeight 4
//內(nèi)存是否連續(xù)分配問題
int main(int argc, char *argv[])
{
int **p = NULL;
p = (int**)malloc(nWidth*sizeof(int*));
if(p == NULL)
return -1;
cout<<"內(nèi)存的不連續(xù)分配:"<<endl;
for(int j = 0; j< nWidth; j++)
{
p[j] = (int*)malloc(nHeight*sizeof(int));
if(p[j] == NULL)
return -1;
}
for(int i = 0; i < nWidth; i++)
for(int j = 0; j < nHeight; j++)
{
printf("%p ",&p[i][j]);
if(j == nHeight-1)
cout<<endl;
}
cout<<endl;
for(int j = 0; j < nWidth; j++)
{
free(p[j]);
p[j] = NULL;
}
free(p);
p = NULL;
int **q = NULL;
q = (int**)malloc(nWidth*sizeof(int*));
if(q == NULL)
return -1;
cout<<"內(nèi)存的連續(xù)分配:"<<endl;
q[0] = (int*)malloc(nWidth*nHeight*sizeof(int));
if(q[0] == NULL)
{
free(q);
return -1;
}
for(int i = 1;i < nWidth; i++)
q[i] = q[i-1] + nHeight;
for(int i = 0; i < nWidth; i++)
for(int j = 0; j < nHeight; j++)
{
printf("%p ",&q[i][j]);
if(j == nHeight-1)
cout<<endl;
}
cout<<endl;
free(q[0]);
q[0] = NULL;
free(q);
q = NULL;
system("PAUSE");
return EXIT_SUCCESS;
}
運(yùn)行截圖如下:
如圖所示,兩種分配內(nèi)存的方法都能正確的分配內(nèi)存,但是內(nèi)存分配的空間確實(shí)不一樣的。
分析:
第一種分配方法:
首先,是對(duì)每一行分配,也就是 nWidth 中的每一個(gè)進(jìn)行分配,所以,我們可以看到每一行的內(nèi)存都是連續(xù)的,每一個(gè)都占據(jù)四個(gè)字節(jié)
但是,為nHeight分配內(nèi)存的時(shí)候,是隨機(jī)的進(jìn)行分配內(nèi)存,所以內(nèi)存的位置是不確定的,所以,出現(xiàn)了第一種情況
第二種分配方法:
首先,同樣是為 p 分配內(nèi)存,現(xiàn)在 p 指向一個(gè)位置
但是,在第二句中,我們需要注意,是直接在 p[0] 出分配了所有需要的內(nèi)存,所以,這個(gè)時(shí)候就全部分配完了,而且由于是一次性分配內(nèi)存,故內(nèi)存的地址肯定是連續(xù)的,運(yùn)行結(jié)果也證明了這一點(diǎn)
釋放內(nèi)存的兩種情況:
第一種情況由于是兩次不同的分配內(nèi)存,所以,在釋放內(nèi)存的時(shí)候,我們應(yīng)選擇不同的區(qū)域進(jìn)行釋放。
第二種情況,只是連續(xù)調(diào)用兩次 malloc ,所以,只需要連續(xù)兩次調(diào)用 free 即可完成釋放。
上一篇:淺析C++中memset,memcpy,strcpy的區(qū)別
欄 目:C語言
下一篇:淺析C語言中printf(),sprintf(),scanf(),sscanf()的用法和區(qū)別
本文標(biāo)題:二維指針動(dòng)態(tài)分配內(nèi)存連續(xù)問題深入分析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4323.html
您可能感興趣的文章
- 01-10深入理解數(shù)組指針與指針數(shù)組的區(qū)別
- 01-10DHCP:解析開發(fā)板上動(dòng)態(tài)獲取ip的2種實(shí)現(xiàn)方法詳解
- 01-10深入探討Linux靜態(tài)庫與動(dòng)態(tài)庫的詳解(一看就懂)
- 01-10基于C++輸出指針自增(++)運(yùn)算的示例分析
- 01-10解析sizeof, strlen, 指針以及數(shù)組作為函數(shù)參數(shù)的應(yīng)用
- 01-10探討C++中數(shù)組名與指針的用法比較分析
- 01-10深入理解雙指針的兩種用法
- 01-10C語言數(shù)組指針的小例子
- 01-10解析如何用指針實(shí)現(xiàn)整型數(shù)據(jù)的加法
- 01-10深入const int *p與int * const p的區(qū)別詳解(常量指針與指向常量的指


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)