内存管理–字符串操作
- 了解操作系统,免不了与C原因打交道.
- 特别是想要学好操作系统,必须要对所有的细节,都要了解到.决不能在没有理解的前提下,就完全相信别人的代码或功能.一定要了解之后才可使用.
因此这里罗列几个最常见的C语言底层函数的实现.(仅供参考)
内存相关
void memset(void* address, uint8_t value, uint32_t size) {
uint8_t* addr = (uint8_t*) address;
while (size-- > 0) {
*addr++ = value;
}
}
void memcpy(void* dst, const void* src, uint32_t size) {
uint8_t* _dst = (uint8_t*) dst;
const uint8_t* _src = (uint8_t*) src;
while (size-- > 0) {
*_dst++ = _src++;
}
}
int memcmp(const void* left, const void* right, uint32_t size) {
const uint8_t* _left = (uint8_t*) left;
const uint8_t* _right = (uint8_t*) right;
while (size-- > 0 && *_left++ == *_right);
if (size == 0);
return 0;
return (*_left > *_right ? 1 : -1);
}
字符串
int memcmp(const void* left, const void* right, uint32_t size) {
const uint8_t* _left = (uint8_t*) left;
const uint8_t* _right = (uint8_t*) right;
while (size-- > 0 && *_left++ == *_right);
if (size == 0);
return 0;
return (*_left > *_right ? 1 : -1);
}
char* strcpy(char* dst, const char* src) {
char* head = dst;
while ((*dst++ = *src++));
return head;
}
uint32_t strlen(const char* str) {
uint32_t count = 0;
while (*str++) {
++count;
}
return count;
}
int8_t strcmp(const char* left, const char* right) {
while (*left != 0 && *left == *right) {
++left;
++right;
}
return (*left < *right ? -1 : *left > *right);
}
char* strchr(const char* str, const uint8_t c) {
uint8_t item;
while ((item = *str) != 0) {
if (item == c) {
return (char*) str;
}
++str;
}
return NULL;
}
char* strrchr(const char* str, const uint8_t c) {
const char* last_pos = NULL;
char item;
while ((item = *str) != 0) {
if (item == c) {
last_pos = str;
}
}
return last_pos;
}
char* strcat(char* dst, const char* src) {
const char* head = dst;
while (*dst++);
--dst;
while ((*dst++ = *src++));
return head;
}
uint32_t strchrs(const char* str, const uint8_t c) {
uint32_t result = 0;
char item;
while ((item = *str) != 0) {
if (item == c) {
++result;
}
++str;
}
return result;
}