您的位置:首页 > 职场人生

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)良好的动态内存申请和释放习惯
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: