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; }