关于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;}
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
4 检查下面代码有什么问题
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是成对出现的,否则造成内存泄露。
阅读全文
0 0
- 关于面试(2)
- 关于C++面试(2)
- 关于写C的面试的讨论(转载)
- 关于面试官(2)
- 关于面试者(2)
- 关于面试(摘录)
- 关于面试(计算机)
- 关于面试(1)
- 关于C语言的面试问题
- c语言关于const的面试常识
- C语言关于字符串逆序输出---面试
- 关于char * c="hello"与char c[]="hello"的区别(面试宝典)
- c面试(zt-2)
- C/C++面试笔试(2)
- C面试宝典-(程序题)2
- C面试题目2
- c面试2-转
- 技术面试(C++)
- 提高linux socket 性能技巧
- 解决Java程序向mysql数据库插入中文乱码问题的多种方式
- 解决UICollectionView ReloadData闪一下(隐式动画)
- 集合概述
- 结构体名 . 与->
- 关于C++面试(2)
- Python之错误,调试和测试
- 1002 Balala Power!
- RxJava之常用操作符整理
- 空指针异常问题
- dataTable 分页失效
- event中的stopPropagation和preventDefault
- vue-cli创建项目的loader问题
- Spring中基于XML文件的方式实现AOP