C语言中关于strcpy函数的一个问题 30

若有语句:chars1[]="string",s2[8],*s3,*s4="string2".则对库函数strcpy的错误调用是A.strcpy(s1,"string2"... 若有语句: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);
我对ACD三个选项都有疑问。A选项,字符串2的长度超过了字符数组s1,而书里提到2不能长于1。C选项s3是空指针,是不是不能直接使用?D选项s2未初始化能否复制?复制过去的内容又是什么?
展开
 我来答
cdyzxy
2019-01-06 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:85%
帮助的人:3765万
展开全部
在定义中,s1是用户开设的数组,包含7个char单元,也就是s1最多存储6个字符,超过则会引起数据存储方面的问题;s2可最多保存7个字符,s3是个指针,可存放字符串起始地址,它在没有赋值指定一个存储空间(通常是字符型数组)之前,无法用来存放字符串(否则是野指针错误);s4也是个指针变量,但初始化指向程序常量区的字符串"string2"的首地址,它指向的单元因为位于常量区,这些单元只允许读,但会被系统拒绝写操作。
A.错误调用,s1最多存放6字符,string2是7个字符,这个字符串的最后一个0很有可能会被意外存放到s2数组的首元素中,这应当是数组越界错误
B.错误调用,s4指向空间是常量空间,不可以被strcpy写
C.错误调用,s3未被指定指向任何存储空间,是野指针或无效指针
D.有可能错误,s2未被初始化,因此其中有可能并没有有效的字符串结束符0,因此要复制的字符串长度未知。但在debug模式下编译运行时,debug环境会自动初始化所有申请的变量为0值,因此在这种情况下可以算是正确调用,但程序在debug模式下运行并不应当作为程序运行的默认条件,严格来说也是错误的。
更多追问追答
追问
关于野指针我有一点疑问
书中提到的char *string;
string="I love China";
*string在赋值前是野指针吗?这种用法和C选项的区别是?
追答
在赋值前是野指针,但string="I love China";并不是存储一个字符串到变量单元的过程,而是编译程序将存放在常量区的字符串首地址赋值给变量string的操作,并不是存放到string指向的单元的操作。
luorenshou
2019-01-06 · TA获得超过112个赞
知道小有建树答主
回答量:182
采纳率:36%
帮助的人:50.4万
展开全部
首先,看各个变量占用的内存空间,s1,8个字节,其中最后一个字节是0,s2,8个字节,初始化未赋值,一般情况都是0,s3,未分配空间,s4,9个字节,最后一个字节是0。其中strcpy是包括赋值0的。
A,数组越界
B,正确
C,s3未分配空间,肯定越界
D,可以,只是无意义,而且可能会因为s2里面没有0,导致没有文本结束符导致越界
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2019-01-06
展开全部
确实都有问题,你确定不是多选吗?

而且B选项也有问题的,s4指向的内容实际上是不可修改的,B选项也会导致段错误.
如果非要选一个,那就选A.
因为题目没有说没有其它语句,比如s2赋值,给s3分配空间什么的.
更多追问追答
追问
没有...我也觉得都有问题
关于野指针我有一点疑问
书中提到的char *string;
string="I love China";
*string在赋值前是野指针吗?这种用法和C选项的区别是?
追答
string="I love China";这样的是字符串是常量,跟s4一样.

而strcpy(string,"I love China");这样的才能修改,比如:string[0]='a';
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
犹秀逸0Fy
2019-01-06 · TA获得超过1524个赞
知道大有可为答主
回答量:1900
采纳率:0%
帮助的人:251万
展开全部
name[0]是一个指针,指向"abc"这个字符串常量。在C语言中,字符串常量被存储在代码段中,只可读不可修改。strcpy函数要拷贝"ABC"到name[0]指向的内存区域(即代码段的字符串常量区),那个区域不可写,所以出现错误。如果想修改,那么不要用字符串常量而是用字符串变量。下面是修改后的代码 #include #include int main(){ char name[2][4]={"abc","efg"}; strcpy(name[0],"ABC"); printf("%s\n",name[0]); return 0;} 这样name是一个二维数组,abc和efg都存在数组里,可以修改。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式