码迷,mamicode.com
首页 > 编程语言 > 详细

C语言经典面试题

时间:2018-11-16 20:52:12      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:col   不能   语言   数组   str   ati   遇到   源地址   经典面试题   

1.分析下面代码有什么问题?
1
2
3
4
5
6
void test1()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
}
字符串str1需要11个字节才能存放下(包括末尾的’\0’),而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会从源地址一直往后拷贝,直到遇到‘\0‘为止。所以拷贝的长度是不定的。如果一直没有遇到‘\0‘导致越界访问非法内存,程序就崩了。
完美修改方案为:
 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] = \0;
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的结果未统计’\0’所占用的1个字节。  

 

4.

 

 

 

 

 

 

 



 
 
 
 
 
 
 
 
 
 

C语言经典面试题

标签:col   不能   语言   数组   str   ati   遇到   源地址   经典面试题   

原文地址:https://www.cnblogs.com/ordinary-world/p/9971045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!