首页 > 试题广场 > 分析下面代码有什么问题?
[问答题]
分析下面代码有什么问题?
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)
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)

少存储了一个字符串结束符 ‘\0’


发表于 2019-11-09 08:18:34 回复(0)

拷贝的类型不同

发表于 2019-11-08 14:57:01 回复(0)

溢出

发表于 2019-11-06 20:13:21 回复(0)

缺少头文件

发表于 2019-11-06 17:10:00 回复(0)

字符数组 过短 ,\0无法存放


发表于 2019-11-05 20:19:45 回复(0)

数组越界了 str还有“\0”

发表于 2019-11-05 15:45:13 回复(0)

变量名为关键词

发表于 2019-11-05 14:26:30 回复(0)

数组越界

编辑于 2019-11-03 10:09:31 回复(0)
任驰骋
发表于 2019-11-01 21:25:37 回复(0)

string内存空间不足,输出会异常(非法访问),直到遇到“\0”

发表于 2019-10-31 19:38:19 回复(0)