首页 > 试题广场 >

分析下面代码有什么问题?

[问答题]
分析下面代码有什么问题?
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 );
}

编辑于 2015-12-14 10:29:14 回复(16)
如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1[url=]内存[/url]起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;  
发表于 2015-10-28 17:57:34 回复(0)
1、string是C++中的标准库类型,不能用作变量名;
2、数组名str1是char *const类型,固定地址,不能赋值。应改为:str[i] = ‘a’;str[9] = ‘\0’;
3、strcpy函数字符串的复制遇到‘\0’才停止,str1中原来没有‘\0’,所以会导致越界访问非法内存。
发表于 2018-07-18 15:53:23 回复(1)
str1 赋值错误,数组名不能做为左值进行赋值,另外,string和str1由于是在函数内定义,不是全局变量,所以数组内初始值不确定,strcpy复制操作具有不确定性
发表于 2015-11-17 21:27:47 回复(0)
  数组是一种数据结构,函数在编译的时候,把数组名是数组首个元素的首地址,可以理解为:数组名等价于存着数组首地址的常量,相当于常量指针,不能直接赋值给指针常量(作左值不合法);
其次,通过循环赋值方式,给字符数组赋值,数组长度:10,只能通过循环赋9个字符常量给字符数组,最后在字符的最后一个字节位置,赋/0;
还有就是 strcpy() 的使用,函数原型声明如下:char *strcpy(char* dest, const char *src);指针常量src,从首地址开始,直到最后一个字节的/0,拷贝进dest,题中,加上最后的结束字符,原数组常量一共11个字节,而dest一共10 个字节,会导致数组越界;
发表于 2018-04-17 19:07:06 回复(0)
1、“str = 'a'”,错误;str为数组名,作为地址,不能对其进行直接字符赋值, 应该改为“str[i]='a'”;
2、strcpy( string, str1 );错误;  strcpy字符串复制函数,遇到‘\0’才结束复制,而源字符串str1中,并没有定义'\0';所以有可能,会出现越界的危险;
    应该增加 “str[9]='\0'”; 同时将循环的限制条件,改为“i<9”;

发表于 2017-02-19 22:04:15 回复(0)
1、str1类型为char[10],循环赋值语句中,‘a’类型为char,明显不合适。应改为str[i],因为str[i]类型为char。
2、strcpy函数原型为strcpy(char * destination,const char * source),注意形参source为const char *型,C语言允许将非const型赋值给const型,但反之不行。所以在string中是不允许修改str1数据的,否则编译会报错
3、strlen()统计的是字符个数,不包含最后的'\0'
发表于 2019-07-08 13:04:56 回复(0)
str1  = 'a';
str1是const char *类型   ‘A’是 const char型。所以不能赋值。
发表于 2018-02-14 08:21:06 回复(0)
第一,数组越界访问。 第二,数组名不能坐左值直接进行赋值, 第三,strcopy函数的字符串复制是只有遇到\0才停止,而str1中没有\0,所以复制的长度不确定。 第四,定义的这这两个字符数组都是局部变量,退出函数就消亡,这个函数没有什么意义,觉得应该把strcopy的值作为函数的返回值返回。
发表于 2016-07-01 10:04:57 回复(4)
知识点:
  • strcpy从源地址开始拷贝,直到遇到\0才结束。如果一直没有遇到\0,就会导致越界访问非法内存。
  • 数组名为指向第一个元素的指针,为char *const类型的右值类型,右值类型不能被赋值。
存在问题:
  • str1  = 'a'; str1为数组名,即指向第一个元素的指针,为char *const类型的右值类型,不能赋值。
  • strcpy( string, str1 ); 如果一直没有遇到\0,就会导致越界访问非法内存。
解决问题:
  • 应改为:str1 [ i ] = 'a' ;  str1 [ 9 ] ='\0' ;
发表于 2017-05-02 10:08:20 回复(1)
(1)str是数组名,不能直接赋值,应修改成: str[i]='a'; (2)str字符串的最后一个字节应当存放\0,故修改循环: for(i=0;i<9;i++) str[i]='a'; str[9]='\0'; 最后用strcpy拷贝时才能成功。
发表于 2021-03-24 23:31:26 回复(0)
Strcpy从圆地址开始拷贝,直到出现\0
发表于 2021-02-18 12:19:48 回复(0)
<p>没有\0</p>
发表于 2021-01-15 00:51:35 回复(0)
<p>字符串后还有一个标识符,需要十一个字节,数组长度只有十个字节</p><p><br></p>
发表于 2020-12-16 00:55:14 回复(0)
<p>str1无法直接赋值</p>
发表于 2020-11-16 22:43:31 回复(0)

<p>数组名为数组第一个元素的地址,将‘a’赋值给地址?(地址只读不可改)显然是不可行的,若要对数组第一个元素进行赋值,也应该是*str1=‘a’

编辑于 2020-09-19 01:25:24 回复(0)
赋值语句错误,其次最后应该加/0
发表于 2020-09-01 13:42:20 回复(0)
1.数组名不能赋值 2.字符串末尾无'\0' 3.函数退出数据就没了,所以无意义,应该把结果作返回值。 4.数组越界访问
编辑于 2020-08-31 18:38:07 回复(0)
<p>数组名本身无法作为左值</p><p><br></p>
发表于 2020-08-22 15:40:58 回复(0)
<p>string不能用做变量名</p><p>把一个字符常量赋值给一个地址,明显不行</p>
发表于 2020-08-17 22:06:08 回复(0)
<p>stri位char *const的右值类型,不能被赋值</p>
发表于 2020-08-11 00:53:13 回复(0)