複製鏈接
請複製以下鏈接發送給好友

calloc

鎖定
函數名: calloc
函數原型:void* calloc(unsigned int num,unsigned int size);
功能:在內存的動態存儲區中分配num個長度為size的連續空間,函數返回一個指向分配起始地址的指針;如果分配不成功,返回NULL。
中文名
動態內存分配並做初始化
外文名
clear allocation
函數名
calloc
函數原型
void *calloc
功 能
動態存儲區中分配num個長度為size的連續空間
頭文件
stdlib.hmalloc.h
相關函數
mallocreallocfree _alloca
領    域
編程

calloc函數簡介

  • 原型:void* calloc(unsigned int num,unsigned int size);
  • 功能:在內存的動態存儲區中分配num個長度為size的連續空間;
  • 注意:num:對象個數,size:對象佔據的內存字節數,相較於malloc函數,calloc函數會自動將內存初始化為0;

calloc與malloc的區別

calloc在動態分配完內存後,自動初始化該內存空間為零,而malloc不做初始化,分配到的空間中的數據是隨機數據。其中malloc的簡介如下:
  • 原型:extern void* malloc(unsigned int size); [1] 
  • 功能:動態分配內存;
  • 注意:size僅僅為申請內存字節大小,與申請內存塊中存儲的數據類型無關,故編程時建議通過以下方式給出,"長度 * sizeof(數據類型)"; [2] 

calloc用 法

void *calloc(size_t nmenb, size_t size);
calloc()函數為nmemb個元素的數組分配內存空間,其中,每個元素的長度都是size個字節。如果要求的空間無效,那麼此函數返回指針。在分配了內存之後,calloc()函數會通過將所有位設置為0的方式進行初始化。比如,調用calloc()函數為n個整數的數組分配存儲空間,且保證所有整數初始化為0:
pi = calloc(n, sizeof(int));
因為calloc()函數會清空分配的內存,而malloc()函數不會,所以可以調用以“1”作為第一個實參的calloc()函數,為任何類型的數據項分配空間。比如:
struct point{ int x, y;} *pi;
pi = calloc(1, sizeof(struct point));
在執行此語句後,pi將指向一個結構體,且此結構體的成員x和y都會被設為0。
一般使用後要使用 free(起始地址的指針) 對內存進行釋放,不然內存申請過多會影響計算機的性能,以至於得重啓電腦。如果使用過後不清零,還可以使用該指針對該塊內存進行訪問。
頭文件:stdlib.h或malloc.h [1] 
相關函數:malloc、realloc、free _alloca

calloc應用舉例

calloc程序例1

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    char*str = NULL;
    /*分配內存空間*/
    str = (char*)calloc(10,sizeof(char));
    /*將hello寫入*/
    strcpy(str, "Hello");
    /*顯示變量內容*/
    printf("String is %s\n",str);
    /*釋放空間*/
    free(str);
    return 0;
}

calloc程序例2

從這個例子可以看出calloc分配完存儲空間後將元素初始化。
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i;
    int* pn = (int*)calloc(10, sizeof(int));
    for(i = 0;i < 10;i++)
        printf("%d", pn[i]);
    printf("\n");
    free(pn);
    return 0;
}
輸出十個0。
參考資料
  • 1.    Borland C++庫函數參考手冊.碧河:北京希望電腦公司,1991:33-34
  • 2.    宗麗蘋 ,吳倩 ,邦繼明.Microsoft C5.0 優化編譯 庫程序參考手冊 上 第6冊:中國科學院科海培訓中心,2013:84-85