C++面试常问的库函数

1 memset()

在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

函数声明:

void *memset(void *s, int ch, size_t n);

将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

void*  memset(void *src, int c, size_t size)
{
    assert(src != NULL);
    char *pSrc = (char *)src;
    while (size--)
    {
        *pSrc++ = (char)c; //转化为char
    }
    return src;
}

2 memcpy()

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

  1. memcpy的函数中源地址指针,目标地址指针,返回地址指针都是void类型。void类型的指针也指向内存地址但是不指定这个地址单元内的数据类型,不能通过间接引用来访问内存中的数据,不能赋值给其他类型的指针,也不能进行算法操作。所以不能对void指针进行如p++的操作,所以需要转换为具体的类型指针来操作,例如char *。
  2. 内存重叠的问题:拷贝时可能存在两个地址的内存覆盖了,这种情况下从后到前拷贝即可。如何判断内存重叠,只需要比较源地址指针和目标地址指针的在size范围内的大小。
  3. 有人说memcpy不能处理内存重叠情况,memmove能处理内存覆盖情况,anyway,我在C++11下面发现memcpy可以处理内存覆盖的情况。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//const约束
void *Memcpy(void *dst, const void *src, size_t size);

int main(int argc, char *argv[])
{
    char buf[100] = "abcdefghijk";
    //memcpy(buf+2, buf, 5);
    Memcpy(buf+2, buf, 5);
    printf("%s\n", buf+2);
}

void *Memcpy(void *d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值