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

linux c庫函數大全:內存控制函數

編輯:關於C語言

1.calloc(配置內存空間)

相關函數:

malloc,free,realloc,brk

表頭文件:

#include <stdlib.h>

定義函數:

void *calloc(size_t nmemb,size_t size);

函數說明:

calloc()用來配置nmemb個相鄰的內存單位,每一單位的大小為size,並返回指向第一個元素的指針。這和使用下列的方式效果相同:malloc(nmemb*size);不過,在利用calloc()配置內存時會將內存內容初始化為0。

返回值:

若配置成功則返回一指針,失敗則返回NULL。

例一:

#include<stdio.h> 
#include<stdlib.h> 
int main(void) 
    { 
        int i; 
        int *pn=(int *)calloc(10,sizeof(int)); 
        for(i=0;i<10;i++) 
        printf("%3d",*pn++); 
        printf("\n"); 
        free(pn); 
        return 0; 
    }

例二:

#include <stdio.h>  
#include <stdlib.h>  
#include<string.h>  
int main(void)  
{  
    //char *str = NULL;  
/* 分配內存空間 */
   char  *str = (char*)calloc(10, sizeof(char));  
/* 將hello寫入*/
    strcpy(str, "Hello");  
// http://www.bianceng.cn
/*顯示變量內容*/
    printf("String is %s\n", str);  
/* 釋放空間 */
    free(str);  
    return 0;  
}

2.free(釋放原先配置的內存)

相關函數

malloc,calloc,realloc,brk

表頭文件

#include<stdlib.h>

定義函數

void free(void *ptr);

函數說明

參數ptr為指向先前由malloc()、calloc()或realloc()所返回的內存指針。調用free()後ptr所指的內存空間便會被收回。假若參數ptr所指的內存空間已被收回或是未知的內存地址,則調用free()可能會有無法預期的情況發生。若參數ptr為NULL,則free()不會有任何作用。

#include <string.h> 
#include <stdio.h> 
#include <malloc.h> 
#include <stdlib.h> 
int main(void) 
{ 
    char *str; 
/* allocate memory for string */
    str = (char *)malloc(10); 
    if(str == NULL){ 
    perror("malloc"); 
    exit(1); 
    } 
/* copy "Hello" to string */
    strcpy(str, "Hello"); 
/* display string */
    printf("String is %s\n", str); 
/* free memory */
    free(str); 
    return 0; 
}

3.getpagesize(取得內存分頁大小)

相關函數:

sbrk

表頭文件:

#include<unistd.h>

定義函數:

size_t getpagesize(void);

函數說明:

返回一分頁的大小,單位為字節(byte)。此為系統的分頁大小,不一定會和硬件分頁大小相同。

返回值:

內存分頁大小。附加說明在Intel x86 上其返回值應為4096bytes。

范例:

#include <stdio.h> 
#include <unistd.h> 
main() 
{ 
    printf("page size = %d\n",getpagesize( ) ); 
}

4.malloc(配置內存空間)

相關函數:

calloc,free,realloc,brk

表頭文件:

#include<stdlib.h>

定義函數:

void * malloc(size_t size);

函數說明:

malloc()用來配置內存空間,其大小由指定的size決定。

返回值:

若配置成功則返回一指針,失敗則返回NULL。

#include <stdio.h> 
#include <stdlib.h> 
main() 
{ 
    int count,*array; /*count是一個計數器,array是一個整型指針,也可以理解為指向一個整型數組的首地址*/
    if((array=(int *) malloc (10*sizeof(int)))==NULL) 
    { 
        printf("不能成功分配存儲空間。"); 
        exit(1); 
    } 
    for (count=0;count<10;count++) /*給數組賦值*/
    array[count]=count; 
    for(count=0;count<10;count++) /*打印數組元素*/
    printf("%2d",array[count]); 
    free(array); 
}

查看本欄目

5.mmap(建立內存映射)

相關函數:

munmap,open

表頭文件:

#include <unistd.h>

#include <sys/mman.h>

定義函數:

void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);

函數說明:

mmap()用來將某個文件內容映射到內存中,對該內存區域的存取即是直接對該文件內容的讀寫。參數start指向欲對應的內存起始地址,通常設為NULL,代表讓系統自動選定地址,對應成功後該地址會返回。參數length代表將文件中多大的部分對應到內存。

參數

prot代表映射區域的保護方式有下列組合

PROT_EXEC 映射區域可被執行

PROT_READ 映射區域可被讀取

PROT_WRITE 映射區域可被寫入

PROT_NONE 映射區域不能存取

參數

flags會影響映射區域的各種特性

MAP_FIXED 如果參數start所指的地址無法成功建立映射時,則放棄映射,不對地址做修正。通常不鼓勵用此旗標。

MAP_SHARED對映射區域的寫入數據會復制回文件內,而且允許其他映射該文件的進程共享。

MAP_PRIVATE 對映射區域的寫入操作會產生一個映射文件的復制,即私人的“寫入時復制”(copy on write)對此區域作的任何修改都不會寫回原來的文件內容。

MAP_ANONYMOUS建立匿名映射。此時會忽略參數fd,不涉及文件,而且映射區域無法和其他進程共享。

MAP_DENYWRITE只允許對映射區域的寫入操作,其他對文件直接寫入的操作將會被拒絕。

MAP_LOCKED 將映射區域鎖定住,這表示該區域不會被置換(swap)。

在調用mmap()時必須要指定MAP_SHARED 或MAP_PRIVATE。參數fd為open()返回的文件描述詞,代表欲映射到內存的文件。參數offset為文件映射的偏移量,通常設置為0,代表從文件最前方開始對應,offset必須是分頁大小的整數倍。

返回值

若映射成功則返回映射區的內存起始地址,否則返回MAP_FAILED(-1),錯誤原因存於errno 中。

錯誤代碼

EBADF 參數fd 不是有效的文件描述詞

EACCES 存取權限有誤。如果是MAP_PRIVATE 情況下文件必須可讀,使用MAP_SHARED則要有PROT_WRITE以及該文件要能寫入。

EINVAL 參數start、length 或offset有一個不合法。

EAGAIN 文件被鎖住,或是有太多內存被鎖住。

ENOMEM 內存不足。

#include<unistd.h> 
#include<sys/mman.h> 
main() 
{ 
    int fd; 
    void *start; 
    struct stat sb; 
    fd=open("/etc/passwd",O_RDONLY); /*打開/etc/passwd*/
    fstat(fd,&sb); /*取得文件大小*/
    start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0); 
    if(start== MAP_FAILED) /*判斷是否映射成功*/
        return; 
    printf("%s",start); 
    munmap(start,sb.st_size); /*解除映射*/
    close(fd); 
}

6.munmap(解除內存映射)

相關函數:

munmap

表頭文件:

#include<unistd.h>

#include<sys/mman.h>

定義函數:

int munmap(void *start,size_t length);

函數說明:

munmap()用來取消參數start所指的映射內存起始地址,參數length則是欲取消的內存大小。當進程結束或利用exec相關函數來執行其他程序時,映射內存會自動解除,但關閉對應的文件描述詞時不會解除映射。

返回值:

如果解除映射成功則返回0,否則返回-1,錯誤原因存於errno中錯誤代碼EINVAL

參數:

start或length 不合法。

范例

參考mmap()

本文出自 “LinuxQt濟南高新區” 博客,請務必保留此出處http://qtlinux.blog.51cto.com/3052744/957661

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