C语言经典面试题

Posted ordinary-world

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言经典面试题相关的知识,希望对你有一定的参考价值。

1.分析下面代码有什么问题?
1
2
3
4
5
6
void test1()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
}
字符串str1需要11个字节才能存放下(包括末尾的’’),而string只有10个字节的空间,strcpy会导致数组越界;  
 
2.分析下面代码有什么问题? 
 1 void test2()
 2 {
 3  char string[10], str1[10];
 4  int i;
 5  for(i=0; i<10; i++)
 6  {
 7  str1  = a;
 8  }
 9 strcpy( string, str1 );
10 }
 
首先,代码根本不能通过编译。因为数组名str1为 char *const类型的右值类型,根本不能赋值。
再者,即使想对数组的第一个元素赋值,也要使用 *str1 = ‘a‘; 
其次,对字符数组赋值后,使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,直到遇到‘‘为止。所以拷贝的长度是不定的。如果一直没有遇到‘‘导致越界访问非法内存,程序就崩了。
完美修改方案为:
 1 void test2()
 2 {
 3     char string[10], str1[10];
 4     int i;
 5     for(i=0; i<9; i++)
 6     {
 7         str1[i]  = a;
 8     }
 9     str1[9] = ;
10     strcpy( string, str1 );
11 }

 

3.指出下面代码有什么问题?
void test3(char* str1)
{
 if(str1 == NULL){
        return ;
 }
 char string[10];
 if( strlen( str1 ) <= 10 )
 {
 strcpy( string, str1 );
 }
}

if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’’所占用的1个字节。  

 

4.

 

 

 

 

 

 

 



 
 
 
 
 
 
 
 
 
 


以上是关于C语言经典面试题的主要内容,如果未能解决你的问题,请参考以下文章

一道经典面试题讲解 :数组越界而没报错 ,却出现死循环 ?(C语言)

经典PHP笔试题

Linux下C语言的几道经典面试题

C语言经典面试题丨快来测一测你的基础语法扎不扎实,你能做出几题?

经典面试题

.NET 经典面试题