关于C++面试(2)

来源:互联网 发布:数控折弯机编程方法 编辑:程序博客网 时间:2024/05/17 08:18

1 分析下面代码有什么问题

void test2(){    char string[10],str1[10];    int i;    for(i=0;i<10;i++)        str1='a';    strcpy(string,str1);}

解答:首先,代码根本不能通过编译。因为数组名str1是char* const类型的右值类型,根本不能赋值。再者,即使相对数组的第一个元素赋值,也要使用*str1='a';

另外,对字符数组赋值后,使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,知道遇到‘\0’为止,所有拷贝的长度是不定的,如果一直没有遇到'\0'导致越界访问非法内存,程序就崩溃了。

完美的修改方案是

void test2(){    char string[10],str1[10];    int i;    for(i=0;i<9;i++)        str1[i]='a';    str1[9]='\0';    strcpy(string,str1);}

2写出完整版的strcpy函数

char* strcpy(char* strDest,const char* strSrc){    //断言,对源地址和目的地址加非0断言    assert((strDest!=nullptr)&&(strSrc!=nullptr));    char *address=strDest;    while((*strDest++=*strSrc++)!='\0');    *address='\0';    return address;}


3 写出完整memcpy函数
void * memcpy(void* dst,const void* src,size_t len){    if(nullptr==dst||nullptr==src)        return nullptr;    void* ret=dst;    if(dst<=src||(char*)dst>=(char*)src+len)    {        //没有内存重叠,从低地址开始复制        while(len--)        {            *(char*)dst=*(char*)src;            dst=(char*)dst+1;            src=(char*)src+1;        }    }    else    {        //有内存重叠,从高地址开始复制        src=(char*)src+len-1;        dst=(char*)dst+len-1;        while(len--)        {            *(char*)dst=*(char*)src;            dst=(char*)dst-1;            src=(char*)src-1;        }    }    return ret;}

注意:首先要备份一下dst的值,这样在函数返回的时候返回的是dst的首地址。另外,考虑一下指针类型,如果dst和src的指针类型不一样,不能直接++操作。最后要考虑一下dst和src是否有地址重叠的情况。

备注:memmove与memcpy的唯一区别就是对待地址重叠情况,详情参照博客http://blog.csdn.net/li_ning_/article/details/51418400

检查下面代码有什么问题

void GetMemory(char* p){    p=(char*)malloc(100);}void Test(){    char* str=nullptr;    GetMemory(str);    strcpy(str,"hello world");    printf(str);}
传入GetMemory(char *p)传入的形参类型是字符串指针,在函数内部修改形参指针并不能修改传入形参的实参值。在函数Test中,执行完GetMemory()后,str仍然是nullptr;另外,malloc和free是成对出现的,否则造成内存泄露。