上一次面试腾讯, 绿盟面试官都问到了同一个问题, 即memcpy(), 和memmove()函数, 但是很遗憾, 没有回答出来, 这几天想起来确实有必要将几个常用的内存函数整理一遍, 这几个函数都是在使用共享内存空间处理数据时,要使用的块数据处理函数,这些函数都包含在string.h中,具体函数如下:
(1)memmcpy()
(2)memchr()
(3)memcmp()
(4)memcpy()
(5)memmove()
(6)memset()
下面详细介绍每一个函数:
1. memmcpy()函数.
该函数的原型是: void *memmcpy(void *dest, const void *src, int c, size_t, n);
该函数的作用是将src指向的对象的字节复制到dest指向的对象, 以便在复制了第一个出现的字节c后,或者复制了n个字节后停止复制,如果在重叠的对象之间进行复制,该行为将是不确定的.memccpy()在复制了src中的c后, 将返回指向dest中下一个字符指针,如果在最前面的n个字节的dest中未找到c,则返回NULL指针.
示例如下:
#include
#include
#include
int main()
{
char *s="Hello world!\n";
char *q,*p;
q = (char*)malloc(strlen(s));
p=memccpy(q,s,'l',strlen(s));
if(p)
{
*p='\0';
printf(" %s\n",q);
}else
printf("Char not found!\n");
return 0;
}
2. memchr()函数.
该函数的原型是: void *memchr(const void *s, int c, size_t n);
该函数的作用是在s指向的最初n个字节,查找第一个出现的c. memchr()将返回找到的第一个c的指针.如果在s指向的n个字节中没有找到c, 则返回NULL指针.
示例如下:
#include
#include
#include
int main()
{
char *p;
char *s = "Hello world!\n";
p = memchr(s, 'o', strlen(s));
if(p)
{
*p != '\0';
printf("%s\n", p);
}else{
printf("Not found!\n");
}
return 0;
}
3. memcmp()函数.
该函数的原型是: int memcmp(const void *s1, const void *s2, size_t n);
该函数的原型是将s1指向对象的前n个字节和s2指向对象的前n个字节进行比较.
#include
#include
#include
int main()
{
char *p = "Ni hao! world!\n";
char *s = "Hello world!\n";
int i;
i = memcmp(s, p, strlen(s));
if(i < 0) {
printf("s is smaller than p!\n");
}else if(i > 0) {
printf("s is bigger than p!\n");
}else{
printf("s is as big as p!\n");
}
return 0;
}
4.memcpy()函数.
该函数的原型是: void *memcpy(void *dest, const void *src, size_t n);
该函数的作用是从s2指向的对象复制n个字节到s1指向的对象,如果在重叠部分进行复制, 则该行为是不确定的.
示例如下:
#include
#include
#include
int main()
{
char *p, *q;
char *s = "Hello world!\n";
p =(char *) malloc(strlen(s));
q = memcpy(p, s, strlen(s));
if(q)
{
printf("%s\n", p);
}else {
printf("copy failed !\n");
}
return 0;
}
5.memmove()函数.
该函数的原型是: void *memmove(void *dest, const void *src, size_t n);
该函数的作用是从src指向的对象复制n个字节到dest指向的对象, 复制时, 假定先将src指定的n个字节, 复制到不与src和dest指向的对象重叠的n个字节的临时数组,然后将临时数组的n个字节复制到dest指定的对象,该函数返回dest的值.
#include
#include
#incldue
int main()
{
char *p, *q;
char *s = "Hello world!\n";
p = (char *)malloc(strlen(s));
q = memmove(p, s, strlen(s));
if(q){
printf("%s\n", p);
}else{
printf("move failed!\n");
}
return 0;
}
6.memset()函数.
该函数的原型是: void *memset(void *s, int c, size_t n);
该函数的作用是用c填充指针s所指向的前n个空间.该函数返回s所指向的空间.
#include
#include
#include
int main()
{
char *p;
char *q;
p = (char*)malloc(10);
q = memset(p, 'o', 10)
if(q){
printf("%s\n", p);
}else {
printf("set failed!\n");
}
return 0;
}
好了, 今天就暂且介绍到这, 有关更深入的下回再写!