memset函數
原型:
void *memset(void *s, int ch, size_t n);
作用:将s所指向的記憶體中的前n個位元組的内容全部設定為ch指定的ASCII值,這個函數通常為新申請的記憶體做初始化工作。一般用于結構體和數組的初始化。
- memset中的第三個參數一定要使用sizeof操作符,因為每個系統下對類型長度的定義可能不一樣。
- memset中的第一個參數一定要是一個已知的、已經被配置設定記憶體的位址,否則會出錯。
- 對于單位元組資料類型(char)可以初始化為任意支援的值,都沒有問題,但是對于非多位元組資料類型隻能初始化為0,而不能初始化成别的初值,否則容易出錯。
memset的效率很高,比手動指派要高的多,比bzero也要高,尤其大數組的情況。
我是這樣實作的:
void* _memset(void* dst,int val, size_t count)
{
assert(dst!=NULL);
char* tmpdst = (char*)dst;
while(count--)
{
*tmpdst = (char)val;
tmpdst++;
}
return dst;
}
memcpy函數
memcpy函數的使用場合是不需要考慮記憶體重疊問題的,因為涉及到記憶體重疊時我們應該調用的是memmove函數。我是這樣實作的:
void* _memcpy(void* dst, const void* src, size_t n)
{
assert(dst!=NULL && src!=NULL);
assert(n>=);
char* temp = (char*)dst;
const char* p = (char*)src;
size_t m=; //void指針不能自增
while(n--)
{
*temp = *p;
temp++;
p++;
}
return dst;
}
memmove進行了改進,考慮了記憶體重疊的情況:
void* my_memmove(void* dst, const void* src, size_t n)
{
char* s_dst;
char* s_src;
s_dst = (char*)dst;
s_src = (char*)src;
if(s_dst>s_src && (s_src+n>s_dst)) {
s_dst = s_dst+n-;
s_src = s_src+n-;
while(n--) {
*s_dst-- = *s_src--;
}
}else {
while(n--) {
*s_dst++ = *s_src++;
}
}
return dst;
}