c::关于strcpy的几道经典的面试题~
2016-12-28 21:43
323 查看
试题1:
void test1() { char str1[10]; char* str2 = "0123456789"; strcpy(str1,str2); }
【说明】:
1)str2要赋值到str1中,str2的大小是11要加上末尾的'\0',而str1的大小是10,数组会发生越界
2)它具体的赋值是str2从内存的起始地址开始进行赋值,赋值到str2的字节数具有不确定性
3)指出库函数strcpy的工作方式,即如何模拟一个strcpy(这个在我的上篇博客里有写,大家可以去看看)
试题2:
void test2() { char str1[10],str2[10]; int i = 0; for(i = 0; i<10; i++) { str2 = 'a'; } strcpy(str1,str2); }
【说明】:
此处的问题所在是给str2赋值后,末尾并没有'\0',因此使用strcpy会一直赋值,导致系统崩溃
试题3:
void test3(char* str1) { char string[10]; if(strlen(str1) <= 10) { strcpy(string,str1); } }
【说明】:
1)此处的问题在于strlen计算字符的个数是不带'\0'的,
2)应该改为if(strlen(str1)<10)
试题4:
void GetMemory(char* p) { p = (char*)malloc(100); } void test4() { char* str = NULL; GetMemory(str); strcpy(str,"hello"); printf("%s ",str); }
【说明】:
1)问题说明:GetMemory(str)这句里传的是str,当调用此函数的时候,相当于传入的是一份形参临时的拷贝,在函数的内部进行形参的修改并不能改变实参的值,所以调用此函数后,str还是NULL,再执行下面的strcpy,程序就崩溃了
2)解决的办法可以看试题6的讲解
试题5:
char *Getmemory() { char p[] = "hello"; return p; } void test5() { char* str = NULL; str = Getmemory(); printf("%s ",str); }
【说明】:
1)函数里的变量属于局部变量,当函数执行完后,变量就被销毁了,所以此时,str是随机值。
试题6:
void GetMemory(char** p) { *p =(char*)malloc(100); } void test6() { char* str = NULL; GetMemory(str,"hello"); strcpy(str); printf("%s",str); }
【说明】:
1)此处就是对试题4的问题改进,
2)但是还有一个问题,就是在使用malloc申请内存后,我们要进行判断内存是否申请成功即if(*p == NULL){//进行内存失败的处理}
试题7:
void test7() { char* str = (char*)malloc(100); strcpy(str,"hello"); free(str); //... }
【说明】:
问题有两个:
1)申请内存后,要进行判断是否申请成功,同6
2)free后,要记得将str =NULL,不然str就会变成野指针
试题8:
void swap(int* p1,int* p2) { int *p; *p = *p1; *p1 = *p2; *p2 = *p; }
【说明】:
此处的问题:使用*p作为中间变量进行交换,但是p是一个野指针,有可能指向系统区,导致系统崩溃,因此我们采用下面的写法
void swap(int *p1,int* p2) { int p = *p1; *p1 = *p2; *p2 = p; }
再次总结:(关于常出现问题的地方)
1、1)字符串是以'\0'结尾的2)strlen计算的时候是不算'\0'的
3)对数组越界的有敏感度
4)对常出现的库函数模拟实现
2、1)对指针的理解:包括一级指针二级指针各自的定义
2)变量的生存周期和作用域
3)良好的动态内存申请和释放习惯