欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

二維指針動(dòng)態(tài)分配內(nèi)存連續(xù)問題深入分析

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語言|點(diǎn)擊: 次

首先,小編先貼出測(cè)試代碼:

復(fù)制代碼 代碼如下:

#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

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有