程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言動態存儲分配

C語言動態存儲分配

編輯:關於C語言

動態存儲分配

C語言支持動態存儲分配,即在程序執行期間分配內存單元的能力,利用動態存儲分配,可以根據需要設計擴大(或縮小)的數據結構,雖然可以適用於所有類型的數據,但是動態存儲分配更常用於字符串、數組和結構體

本文地址:http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html,轉載請注明源地址。

1、內存分配函數

3種內存分配函數都是聲明在<stdlib.h>中:

  • malloc函數--分配內存塊,但是不對內存塊進行初始化
  • calloc函數--分配內存塊,並且對內存塊進行消除
  • realloc函數--調整先前分配的內存塊

malloc函數不需要對分配的內存快進行清除,所以它比calloc函數更高效

當申請內存塊而調用內存分配函數的時候,函數會返回void*型的值。內存中對象的空間大小,是以“字節”的數目為單位計算的,許多頭文件都定義了size_t類型,專門用來保存這種“內存”空間的相關信息,比如sizeof運算符返回字節的數目,類型是size_t

2、空指針

由於用名NULL的宏來表示空指針,所以常使用下列方式測試malloc函數的返回值:

p=malloc(10000);
if(p==NULL) {
    /*分配失敗*/
}

在C語言中,指針測試真假的方法和數的測試一樣:

if(p==NULL)
if(!p)
if(p!=NULL)
if(p)

舉例如下:

typedef struct {
    long key;
    /*...*/
}Record;
float *myFunc(size_t n)
{
    double *dptr=malloc(sizeof(double));
    if(dptr==NULL)
    {
        /*...*/
        return NULL:
    }
    else
    {
        *dptr=0.07;
    }
    /*...*/
    Record *rptr;
    if(rptr=malloc(2*sizeof(Record))==NULL)
    {
        /*...*/
        return NULL;
    }
    float *fptr=malloc(n*sizeof(float));
    if(fptr==NULL)
    {
        /*...*/
        return NULL:
    }
    /*...*/
    return fptr;
}

動態分配數組

使用malloc函數為數組分配存儲空間,需要使用sizeof運算符來計算每個元素所需要的空間數量

int *a;
a=malloc(n * sizeof(int));

calloc函數

calloc函數在<stdlib.h>中具有如下的原型:

void *calloc(size_t nmemb, size_t size);

在分配了內存之後,calloc函數會通過對所有位設置為0的方式進行初始化

a=calloc(n, sizeof(int))

struct point{int x,y;}*p;
p=calloc(1,sizeof(struct point));

realloc函數

realloc函數可以調整數組的大小使它更適合需要,realloc函數原型在<stdlib.h>中:

void *realloc(void *ptr, size_t size)

ptr指向的內存塊一定是先前通過malloc函數、calloc函數或realloc函數的調用獲得的,size表示內存塊的新尺寸

C語言標准列出幾條關於realloc函數的規則:

  • 當擴展內存塊時,realloc函數不會對添加進內存塊的自己進行初始化
  • 如果realloc函數不能按照要求擴大內存塊,那麼它會返回空指針,並且在原有的內存塊中的數據不會發生改變
  • 如果realloc函數調用時以空指針作為第一個實際參數,那麼它的行為就像malloc函數一樣
  • 如果realloc函數調用時以0作為第二個實際參數,那麼它會釋放掉內存塊

釋放存儲

內存分配函數所獲得的內存塊都來自一個稱為堆的存儲池

p=malloc(...)
q=malloc(...)
p=q;

上面的代碼使得p和q都指向同一塊內存,導致出現內存洩露,使用free函數來釋放不需要的內存,來回收垃圾

free函數在<stdlib.h>中有如下原型:

void free(void *ptr)

以上的代碼改寫如下:

p=malloc(...)
q=malloc(...)
free(p);
p=q;

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved