首页 > 试题广场 > 分析下面代码有什么问题?
[问答题]
分析下面代码有什么问题?
void test1() 
{ 
 char string[10]; 
 char* str1 = "0123456789"; 
 strcpy( string, str1 ); 
} 
推荐
字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;  
编辑于 2015-12-12 12:03:05 回复(10)
代码本身没有错误,如果将str1拷贝到string中,string的长度会增加,并且也可以正确的输出string。
(c、java代码都测试过,没有问题)
但是存在潜在的危险,string定义的长度是10,而拷入str1之后string的长度增为11,也就是说,在内存中,如果紧接string之后有内容,将被覆盖,这样会导致string之后的内存存取错误。
发表于 2016-03-01 10:47:59 回复(11)
知识点:
  • 允许用字符串字面值对字符数组初始化,\0也会拷贝进去。
  • 编译器会自动把数组名字替换为指向数组首元素的指针。
  • strcpy为c风格字符串的函数,定义在头文件cstring中,strcpy(p1,p2)将p2拷贝给p1,返回p1。

存在问题:
  • string不能用作变量名,string是c++中的标准库类型。
  • str1是一个指向字符的指针/字符数组,字符串字面值"0123456789"的长度为11,strcpy函数将str1拷贝给string,但string大小为10,str大小为11,导致数组越界。
发表于 2017-05-02 10:08:04 回复(1)
首先,在c语言中,string可以用作变量名,
但是在c++中,这样使用string是错误的,c++保留了string作保留字;
其次,编译器会自动将数组名作为指向数组首地址的指针处理;保证char *strcpy(char* dest, const char *src);符合原型声明规定;即函数内元素必须是指针;【strcpy()在头文件#include<string.h>内包含】;
str1是指向字符的指针/字符数组,使用字符串:“0123456789”对其进行赋值占用11字节的空间【包括字符串结束标志符:\0】;
声明数组string[]的时候,给了10 个字节的内存空间,进行拷贝实现的时候,会出现数组越界;


发表于 2018-04-17 17:22:59 回复(0)
strcpy(s1,s2);strcpy函数的意思是:把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy. 这样s1在内存中的存放为:ch\0;故所需的空间是11个字节,而规定的字符数组string是10个字节,虽然编程时没有报错,但还是存在数组越界情况
发表于 2017-06-21 19:16:13 回复(0)
strcpy(s1,s2);strcpy函数的意思是:把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy.
这样s1在内存中的存放为:ch\0;故所需的空间是11个字节,而规定的字符数组string是10个字节,虽然编程时没有报错,但还是存在数组越界情况
发表于 2017-02-27 16:56:24 回复(0)
char*前边还需要加const才可以
发表于 2019-10-08 19:33:04 回复(0)
1.string是C++中的一个类名,不可以作为变量名 2.strcpy函数的实现是以'\0'判定拷贝结束的,并且会给目标字符串结尾加一个'\0',所以会向目标字符数组拷贝11个元素,问题就在于如果第十个元素后的内存没被分配,那么这个目标字符数组中存的字符串是可以被打出来了,如若不然,第11个元素的内存空间很容易被改写,导致字符串打印出错~
发表于 2019-06-15 20:16:00 回复(0)
这个题实际上考察是是strcpy的实现
strcpy函数存在的三个问题:(1)无结束符(2)内存不足(3)内存重叠
char* strcpy(char* dst,const char* src){
    assert(dst!=NULL&&src!=NULL);
    char *ret=dst;//ret是还回值
    while((*dst++=*src++)!='\0');//注意不管是*p++还是*(p++)都是先取地址然后在取出实际的值
    //循环判断条件是以结束符\0,所以src一定不能不带结束符
    return ret;
}


编辑于 2020-04-13 15:12:03 回复(0)
string1里面包含10个字符,再加结束符总共十一个。而string只有10个空间,然而在调用strcpy函数时,string字符串会强行扩充原来字符串最后一个字符地址之后的一个字符空间,导致第十一个字符会覆盖后面未知空间里的数据。有隐患,但是运行结果一般是没问题,这是strcpy一直存在的问题。
编辑于 2019-03-06 21:04:55 回复(0)
越界,结果未知
发表于 2018-11-24 19:41:34 回复(0)
复制的时候,会把字符串最后的'\0'一起复制,所以会数组越界。这是非常危险的!一旦出错,调试很困难!
发表于 2017-08-18 16:52:49 回复(0)
<p>字符串超过了</p><p><br></p>
发表于 今天 10:38:22 回复(0)
<p>越界了</p>
发表于 今天 00:09:15 回复(0)
<p>内存超限</p>
发表于 2020-06-01 22:01:33 回复(0)
<p>字符丢失,因为\0站一位空间</p><p><br></p>
发表于 2020-05-27 21:55:58 回复(0)
<p>字符串11个字符,字符数组10个位置,会溢出</p>
发表于 2020-05-23 22:29:29 回复(0)
<p>会导致数组越界</p><p><br></p><p><br></p>
发表于 2020-05-23 18:21:00 回复(0)
<p>字符串拷贝越界</p>
发表于 2020-05-18 23:16:49 回复(0)
void test1()
{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );
}
错误总结:
1. string是C++关键字,不能用做变量名;
2. strcpy字符串拷贝函数在判断拷贝结束时,是以源字符串的字符结束标识'\0'为标记的,因此目标字符串总共需要11个字节,因此这里目标字符串会发生访问越界,char string[10]内存后面存放的数据会被覆盖掉。
发表于 2020-05-17 15:17:19 回复(0)
<p>C++中每个字符串都以’t’结尾 多占用一个字符串数组空间。造成数组越界</p>
发表于 2020-05-16 18:01:03 回复(0)