国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

c++中常用的內存操作函數

2019-11-06 07:23:46
字體:
來源:轉載
供稿:網友

1.malloc()函數,calloc()函數和free()函數

malloc()函數和free()函數

       malloc()函數原型:

void *malloc(size_t size);

malloc()函數用來內存分配,如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當然,對于malloc()函數所對應的就是free()函數,你所開辟的內存,后來當然需要釋放。注意malloc()函數是在堆上進行操作的。

free()函數原型:

void free(void *pointer);

free()函數 是用來把在前面分配出去的內存進行回收,以備后備之需。

calloc()函數和realloc()函數

calloc()函數原型:

void *calloc(size_t num_elements,size_t element_size);

calloc()函數也用于分配內存,它主要是要把分配的內存會初始化為0。

realloc()函數原型:

void realloc(void *ptr,size_t new_size);

realloc()函數用于修改一個原先已經分配好的內存塊的大小。使用這個函數,可以進行內存的擴大和縮小。

這幾個函數我在前期的一篇博客中已經詳細的敘述過了,在此就不再太多聲明了。 C語言之動態分配內存

2.memcpy()函數,memmove()函數和memset()函數

memcpy()函數

memcpy()函數原型:

void *memcpy(void *dst, void const *src, size_t length);

memcpy()函數實現:

//memcpy( )函數的實現#include<stdio.h>#include<stdlib.h>#include<assert.h>void *my_memcpy(void *dest, const void* src, size_t length) {    assert(src);         char *pdest = (char *)dest;         const char *psrc = (const char *)src;while (length--)    {        *pdest = *psrc;        pdest++;        psrc++;    }    return dest; }int main() {    char arr1[20] = "abcd";        char *arr2 = "efgk";     my_memcpy(arr1, arr2, 2);        PRintf("%s/n", arr1);     system("pause");         return 0; }

memcpy()函數從src的起始位置復制length個字節到dest的內存起始位,memcpy( )函數 并不關心被復制的數據類型,只是逐字節地進行復制,這給函數的使用帶來了很大的靈活性,可以面向任何數據類型進行復制。 注意: dest 指針要分配足夠的空間,也即大于等于 num 字節的空間。如果沒有分配空間,會出現斷錯誤。 dest 和 src 所指的內存空間不能重疊。 在這里面的重疊問題,就是以下這種情況: 

為了解決這一種重疊的問題,在此我們引入了另一個內存操作函數:memmove()函數。

memmove()函數

memmove()函數原型:

void *memmove(void *dst, void const *src,size_t length);

memmove()函數函數和memcpy()函數所進行的操作差不多,不過會考慮重疊的問題,所以,對于源和目標參數可能存在重疊問題,那么就可以使用memmove(),當src 和 dest 所指的內存區域重疊時,memmove() 仍然可以正確的處理,不過執行效率上會比使用 memcpy() 略慢些。

memmove()函數實現:

//memmove()函數的實現#include<stdio.h>#include<stdlib.h>#include<assert.h>void *my_memmove(void *dst, void * src, size_t length) {    assert(dst);    assert(src);    char *pdest = (char *)dst;    const char *psrc = (const char *)src;    if ((pdest > psrc) && (pdest<psrc + length))            {//從后向前拷貝                while(length--)                {                    *(pdest+length) = *(psrc+length);                }            }            else            {//從前向后拷貝                while(length--)                {                    *pdest++ = *psrc++;                }            }              return dst; }int main() {    int i = 0;          int arr1 []= { 1,2,3,5,4,6,8 };          int sz = sizeof(arr1) / sizeof(arr1[0]);     my_memmove(arr1 + 2, arr1, 16);          for (i = 0; i<sz; i++)          {              printf("%x ",arr1[i]);    }    system("pause");          return 0; }

memset函數 memset函數原型:

void *memset(void *a, int ch, size_t length);

memset()函數是把從a開始的length個字節都設置成為字符值ch,然后返回指向 ptr 的指針。 memset( ) 可以將一段內存空間全部設置為特定的值,所以經常用來初始化字符數組。

memset函數實現:

//memset()函數實現#include<stdio.h>#include<stdlib.h>#include<assert.h>void *my_memset(void *dest, int n, size_t length) {    void *ret = dest;    assert(dest);    while(length--)    {        *(char *)dest = n;        dest = (char*)dest+1;    }    return ret; }int main() {    int arr1[10];           int i = 0;          int sz = sizeof(arr1) / sizeof(arr1[0]);    my_memset(arr1, 0, sz*sizeof(int));    for ( i = 0; i<sz; i++)    {        printf("%d ",arr1[i]);    }    system("pause");    return 0; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 耒阳市| 阳信县| 搜索| 丹寨县| 通河县| 渑池县| 广平县| 博白县| 额济纳旗| 深水埗区| 宜昌市| 吴旗县| 南开区| 三都| 藁城市| 神农架林区| 外汇| 永和县| 哈尔滨市| 罗定市| 保山市| 和政县| 上林县| 彰化市| 丰都县| 嘉兴市| 林周县| 海原县| 池州市| 沅陵县| 龙里县| 淮南市| 武汉市| 桐柏县| 鄂托克旗| 嘉善县| 永春县| 衢州市| 临澧县| 武功县| 卓尼县|