首先可以用man命令查看一下memset函数的使用手册
关于man命令在linux下开发的使用
man 1 +命令 如:ls,man
man 2 +系统借口 如:open,close
man 2 +C语言库函数 如:fopen,memset
memset函数就是我们通常的初始化函数,虽然C语言的库为我们提供了该函数,当我们使用时可以直接调用,但是作为一名开发者,我们必须懂得该函数的原理,并且会写该函数。
这里贴出Linux内核源码,可以通过对比学习学习。
void *memset(void *s, int c, size_t count)
{
char *xs = s;
while (count--)
*xs++ = c;
return s;
}
这里补充如何配置ctags(Generate tag files for source code)来阅读源码
1.首先在网上下载并解压Linux内核源码包
2.cd 进入解压的文件,执行命.令ctags -R ./ 生成tags文件
3.vim /etc/vimrc 编辑vim配置文件 set tags=/linux内核源码目录路径/tags
4.vim -t 要查看的变量名或者函数
5.或者vim进入冒行模式,输入 : ta 要查看的变量名或函数
6.Ctrl+ ]跳到光标所在函数或者结构体的定义处
strlen是一个求字符串长度的函数,不包含’\0’
源码在此
size_t strlen(const char *s)
{
const char *sc = s;
while (*sc != '\0')
sc++;
return sc - s;
}
strcpy是一个拷贝字符串的函数,strncpy是一个拷贝字符串制定长度的函数
源码在此
char *strcpy(char *dest, const char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != '\0')
/* nothing */;
return tmp;
}
strcmp函数是比较两个字符串的大小,返回一个整形变量
若str1 = str2,则返回零;
若str1 < str2,则返回负数;
若str1 > str2,则返回正数。
源码如下:
int strcmp(const char *str1, const char *str2)
{
const unsigned char *s1 = (const unsigned char *)str1;
const unsigned char *s2 = (const unsigned char *)str2;
int delta = 0;
while (*s1 || *s2) {
delta = *s1 - *s2;
if (delta)
return delta;
s1++;
s2++;
}
return 0;
}
//s1和s2作自增运算时,不应该放在 while()里,避免结束循环时,额外多做一次自增运算。
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
源码在此:
char *strstr(const char *s1, const char *s2)
{
size_t l1, l2;
l2 = strlen(s2);
if (!l2)
return (char *)s1;
l1 = strlen(s1);
while (l1 >= l2) {
l1--;
if (!memcmp(s1, s2, l2))
return (char *)s1;
s1++;
}
return NULL;
}
//memcmp是将地址为s1和s2的两块内存作比较。
//strncmp是将两个字符串s1,s2按字节进行比较,遇到’\0’截止。
atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数
这里我自己实现的最简单的版本,只能转换正整数
int myatoi(char *p)
{
int i;
int res = 0;
for(i = 0; i < strlen(p); i++){
res = (*(i+p) - '0') + 10 *res;
}
return res;
}
char a[] = "hello";
char *p = "hello";
a是一个数组,存放一串字符,每个字符在内存的栈区都对应一个地址,是可读可写的一段空间。
p是一个指针,存放字符串”hello”的地址,指针p在栈区对应一个地址,但p指向”hello”,”hello”却是常量,不能对p指向的地址作写操作。
内存分区:
名称 | 代码区 | 只读数据区 | 全局变量区 | 堆区 | 栈区 |
---|---|---|---|---|---|
权限 | 只读 | 只读 | 读写 | 读写 | 读写 |
内容 | 指令代码 | 数据 | 静态变量static | 动态申请的空间 | 数组等 |
#include
int main(int argc, char *argv[])
{
printf("%d\n", argc);
printf("%s\n", argv[0]);
printf("%s\n", argv[1]);
printf("%s\n", argv[2]);
printf("%s\n", argv[3]);
printf("%s\n", argv[4]);
return 0;
}
int argc存放参数个数,包括./main的执行命令
char *argv[] 是一个指针数组,每一个数组元素都是一个指针,指向对应位置上参数的地址