【轉】C記憶體操作函數

來源:互聯網
上載者:User

標籤:des   ar   io   使用   sp   for   檔案   問題   bs   

一、malloc/calloc

名稱: Malloc/calloc
功能:  動態記憶體分配函數
標頭檔: #include <stdlib.h>
函數原形: void *malloc(size_t size);
void *calloc(size_t num,size_t size);
參數:  size    分配記憶體塊的大小
num  分配記憶體塊的個數
傳回值:  成功返回分配記憶體塊的首地址,失敗返回NULL.

malloc和calloc都可以分配記憶體區,但malloc一次只能申請一個記憶體區,calloc一次可以申請多個記憶體區.另外calloc會把分配來的記憶體區初試化為0,malloc不會進行初始化.

#include <stdio.h>
#include <stdlib.h>
main()
{
    int *p=NULL;
    p=(int *)malloc(sizeof(int));
    if(p==NULL)
    {
        printf("malloc error/n");
        exit(1);
    }
    *p=3;
    printf("%d/n",*p);
    free(p);
}

二、malloc/calloc

名稱: free
功能:  動態記憶體釋放函數
標頭檔: #include <stdlib.h>
函數原形: void free(void *ptr);
參數:  ptr   使用malloc或calloc等記憶體配置函數所返回的記憶體指標 
傳回值: 

free 可以釋放由malloc或calloc等記憶體配置函數分配的記憶體.當程式很大時,期間可能要多次動態分配記憶體,如果不及時釋放的話,程式將要佔用很大記憶體.

要注意,如果ptr所指記憶體已被釋放或是未知的記憶體位址,則可能有無法預期的情況發生.若參數為NULL,則free不會有任何作用.

三、memset

名稱: memset
功能:  初始化所指定的記憶體空間
標頭檔: #include <stdlib.h>
函數原形: void *memset(void *buffer,int c,int count);
參數:  buffer      分配的記憶體
c      初始化內容
count      初始化的位元組數   
傳回值:  返回指向buffer的指標

memset把buffer所指記憶體地區的前count個位元組設定成某個字元的ASCLL值.一般用於給數組,字串等類型賦值.

main()
{
    int *p=NULL;
    int i;
    char *q=NULL;
    
    p=(int *)malloc(sizeof(int)*10);
    if(p==NULL)
        exit(1);
    memset(p,0,sizeof(int)*10);
    q=p;
    for(i=0;i<10;i++)
        printf("%d",*(q++));
    free(p);

 執行結果是10個0.

四、memcpy

名稱: memcpy
功能:  拷貝記憶體空間
標頭檔: #include <stdlib.h>
函數原形: void *memcpy(void *dest,void *src,unsigned int count);
參數:  dest       目標記憶體區
src    原記憶體區
count      要複製的位元組數
傳回值:  指向dest的指標

memcpy會把src所指記憶體區複製count個位元組到dest所指記憶體區.如果count比src位元組數大,strcpy會拷貝‘/0‘後結束.要注意dest和src不要重疊.

memcpy只是拷貝記憶體空間,不處理空間重疊的問題.

main()
{
    int *p1=NULL;
    int *p2=NULL;
  int q;
    int i;
    
    p1=malloc(sizeof(int)*10);
    if(p1==NULL)
        exit(1);
    p2=malloc(sizeof(int)*5);
    if(p2==NULL)
        exit(1);
    memset(p1,0,sizeof(int)*10);
    memcpy(p2,p1,sizeof(int)*5);
    q=p2;
    for(i=0;i<5;i++)
        printf("%d",*(q++));
 
    free(p1);
    free(p2);
)

運行結果為5個0.

五、memmove

名稱: memmove
功能:  拷貝(移動)記憶體空間
標頭檔: #include <stdlib.h>
函數原形: void *memmove(void *dest,void *src,unsigned int count);
參數:  dest       目標記憶體區
src    原記憶體區
count      要複製的位元組數
傳回值:  指向dest的指標

Memmove和函數memcpy函數功能一樣,但只是拷貝記憶體空間,不處理空間重疊的問題.Memmove會處理空間重疊問題.當dest和src重疊時,仍能正確處理,但src內容發生改變.

六、memmove

名稱: memcmp
功能:  比較兩個記憶體空間的字元
標頭檔: #include <stdlib.h>
函數原形: int memcmp(void *buf1,void *buf2,unsigned int count);
參數:  buf1       記憶體區
buf2    記憶體區
count      要比較的字元數
傳回值:  見下面

Memcmp會比較記憶體地區buf1和buf2的前count個位元組.Memcmp回根據ASCLL碼錶順序依次比較.當buf1<buf2時,返回<0;當buf1=buf2時,返回0;當buf1>buf2時,返回>0.

main()
{
    int *p1=NULL;
    int *p2=NULL;
    int rt;
  
    p1=malloc(sizeof(int)*10);
    if(p1==NULL)
        exit(1);
    p2=malloc(sizeof(int)*10);
    if(p2==NULL)
        exit(1);
    memset(p1,‘a‘,sizeof(int)*10);
    memset(p2,‘b‘,sizeof(int)*10);
    rt=memcmp(p1,p2,sizeof(int)*10);
    if(rt>0)
        printf("p1>p2);
    if(rt<0)
        printf("p1<p2");
    if(rt==0)
        printf("p1=p2");
    
    free(p1);
    free(p2);
}

運行結果:p1<p2

【轉】C記憶體操作函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.