面试常见问题memcpy memmove

文章讲述了C++编程中的内存管理函数memcpy和memmove的区别,以及malloc使用注意事项。强调了字符串长度计算、void类型指针转换、内存安全和指针运算的基础知识,对面试者有实用价值。
摘要由CSDN通过智能技术生成

面试常见问题:c++ memcpy memmove

#include<iostream>
#include<string>
#include<stdlib.h>
#include<stdio.h>
int main()
{
    char* p1 = "abcd";
    char* p2 = (char*)malloc(sizeof(char)*5);
    char *p3 = (char*)memcpy(p2,p1,5);
    printf("p2 is %s, p3 is %s\n",p2,p3);
    return 1;
}

注意点1:melloc/memcpy返回的都是void类型指针需要进行强制类型转换。
注意点2:声明字符串的时候,“abcd"实际上在内存中是"abcd\0”,实际上长度是5。所以如果后续复制长度为4,那么输出的时候会一直输出到内存中\0的位置,导致乱码出现。而如果复制长度>5,那么输出%s的时候由于遇到了\0就会先停止。
注意点3:常见用法

void* memcpy(void*src,const void* src,size_t size);
//size_t 是一个无符号整数类型
//在不同的系统中,它的具体大小可能会有所不同。
//在大多数情况下,它被定义为unsigned int或 unsigned long

注意点4:memcpy 完整复制完num 字节,但是要求dest分配空间比num大否则会出现错误。strcpy复制过程中遇到\0停止。

注意点5:memmove可以处理src 和dest在内存上有重叠的问题。这个博主写的很好。
https://blog.csdn.net/qq_73435980/article/details/133582607
关于指针的额外一些复习点:

#include<iostream>
#include<string>
#include<stdlib.h>
#include<stdio.h>
int main()
{
    char* p1 = "abcd";
    std::cout<<p1[0]<<std::endl;//输出a
    std::cout<<*p1<<std::endl;//输出a
    std::cout<<*(++p1)<<std::endl;//输出b

    int ar[2][6] = {{1,2,3,4,5,2},
                    {4,5,2,7,2,5}};
    int* tem = ar[0];
    std::cout<<*tem<<std::endl;//输出1
    std::cout<<*(tem+5)<<std::endl;//输出2
    std::cout<<*(tem+6)<<std::endl;//输出4

    tem = &ar[0][0];
    std::cout<<*tem<<std::endl;//输出1
    std::cout<<*(tem+5)<<std::endl;//输出2
    std::cout<<*(tem+6)<<std::endl;//输出4

    return 1;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值