char s1[]="string",s2[8],*s3,*s4="string2" 下面对strcpy的调用那些是正确的,为什么,求详解?

A:strcpy(s1,"string2")B:strcpy(s4,"string1")C:strcpy(s3,"string1")D:strcpy(s1,s2)... A:strcpy(s1,"string2")
B:strcpy(s4,"string1")
C:strcpy(s3,"string1")
D:strcpy(s1,s2)
展开
 我来答
ahanqiankun
2011-03-25
知道答主
回答量:34
采纳率:0%
帮助的人:12万
展开全部
A,可以正确执行,但是因为拷贝内容的长度超出存储区一个字符,可能会导致下次访问的时候,访问到一个错误的字符串。因为c或c++里的字符串是以'/0’结尾的,原先结尾处的'/0'被覆盖,会导致程序找不到正确的字符串结尾。我测试中在程序结尾dump时出错,可能是因为调试器需要dump字符串的内容,从而导致错误。
B,执行结果可能会因为编译器的不同而有所不同。在有些编译器中,s4指向的内存区是要求只读的。但是,我测试gcc编译器好像执行没有问题。
C,s3未被初始化,可能指向系统中的任意位置。最可能的结果是访问地址越界。即便程序在执行这句时不报错,结果也是未知的,有可能导致系统更严重的错误。
D,s2内的内容是未初始化的。如前面所说,被当成字符串处理时将无法找到正确的字符串结尾。该语句执行的结果未知,主要看是否会再次访问该字符串。
追问
请问下如果一个有这么一个定义char s1[]="abc" 能否再为s1赋值如:s1="abcd"(此时比原来多一个字符)
您的意思是不是说A在编译时不出错但是可能执行时会出错?
这个题目给出的答案是ABD都是正确的
对于D s2没有初始化在编译时是不是把所有元素都默认初始化为0即'\0';所以D的结果就是让s1变成了\0tring\0,您看我理解的对不对
追答
如果答案是ABD的话,就是指能不能编译通过。如果你是想学程序设计,而不是应付考试的话,不必计较这种答案,因为在开发时没人会这么写。我一般都会避免这种边界情况的发生。
你的追问中的s1="abcd"是不合法的,因为c或c++都不支持给数组直接赋值。如果使用指针的话,当然就可以随便赋值了。因为指针的修改只是改变指向,而不涉及内容的修改。
至于对D选项,C++规范里是没有规定对数组默认初始化的,所以你不可以存在默认初始化,即便有些编译器会这么做。不符合规范就意味着代码到其它编译器中会出现不可预知的行为。D的执行结果是将s2的内容当作字符串看待,并将其内容拷贝到s1中。如果恰巧s2后边第1000个字符空间中才遇到0的话,这条语句就会拷贝999个字符到s1中,那时就必定会出内存访问错误了。
olive_pei
2011-03-25 · TA获得超过111个赞
知道答主
回答量:49
采纳率:0%
帮助的人:50万
展开全部
应该选A。
虽然s1的空间不够但是调用strcpy函数是不会检查溢出的。就算检查溢出也是占用的s2的空间,不影响别的变量。
对于选项B,由于s4是个指针所以在内存中只分配了4个字节的空间,其中放的是一个指向常量区的地址。这个常量区的地址中就放着"string2",常量区是不允许被访问来改变值的,也就是不允许用户来写。
对于选项C,s3只是一个指针,在内存中就占了4个字节,而且是用来存放地址的,strcpy函数的第一个参数是指向一个内存空间的指针,因此这个也是错的。
对于选项D,在strcpy函数中,定义的第二个参数必须是以null结尾的字符串,而s2只是个没有定义的字符数组,因此也是不对的。
追问
其中只有C是错误的  ABD都是正确的
您再想想看
追答
严格来讲,string2是存储在常量区的,常量区是不允许作为左值的,我没查找strcpy是如何实现的,不过用户是不能自己修改常量区数据的,举例说明就是如果用语句*(str4+1)='t'来修改字符串的话就会报错,就是这个道理。
至于你说的D选项,看数组定义在哪里了,如果是个局部的数组变量是不会默认初始化的,如果是个全局的话,会根据你说的来进行初始化。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bdwnk
2011-03-25
知道答主
回答量:38
采纳率:0%
帮助的人:13.6万
展开全部
都不正确
a越界
b非法访问
c无空间
d源字符串无法获得长度
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wleifx
2011-03-26
知道答主
回答量:6
采纳率:0%
帮助的人:6.5万
展开全部
实践出真知,你写段代码验证下不就有答案了嘛!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式