面试常见问题: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;
}