请教两道C语言的题目!

1.charx[8]={0};chary[8]={0};strncpy(x,"Hello",sizeof(x));strncpy(y,"HelloWorld",sizeo... 1.
char x[8]={0};
char y[8]={0};
strncpy(x,"Hello",sizeof(x));
strncpy(y,"Hello World",sizeof(y));
strlen(x)和strlen(y)的输出结果分别是()
A、5和8 B、5和7 C、5和11 D 5和未知。

答案选C。不知道为什么strlen(y)的结果是11.

2.

已知某系统架构下,C函数用栈传递参数,参数的入栈顺序为从右到左,且栈由高地址
向低地址方向增长。那么在该系统下,下面的函数f的返回值为

( B )
int f(int a, int b)
{
return (&b - &a);
}

A、1 B、2 C、3 D、4
这题答案为什么是B呢?
展开
 我来答
White_MouseYBZ
推荐于2016-01-14 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6356万
展开全部
  1. 此题的正确答案不应该是C而应该是D。因为y的最大长度为8,sizeof(y)自然是8,向y里拷进8个字符后就把'\0'覆盖了,这个字符串就没有了结束符'\0',所以strlen(y)大于等于8的任何数都是可能的。

  2. 此题的正确答案应该是A.1而不是B.2。因为两个4字节的变量紧挨着,地址相差就是1。但有个情况要说明一下:在16位机中,int是2字节,如果编译器的所谓“对齐”方式也是4的话(我还真不知道16位机的变量存放对齐方式是不是4)那就是B.2;这个可以把f函数改成int f(short a, short b)来验证,因为32位机的short是2字节,而对齐方式又是4。

更多追问追答
追问

可是第一个用代码敲得话输出的答案是C啊,我也觉得答案应该是D;

第二个的标准答案是:

追答
那显然就是标准答案错了。在你提供的这种变量长度机制下,对齐方式是4为倍数,而int恰为4,所以相邻两个变量的地址只可能差1。
第一题你就没有琢磨我说的大于等于8……,凡是>=8的结果都可能出现。为了验证,你可以在char y[8]={0};前加一个声明,比如int tmp=123,情况可能会有变化……
匿名用户
2014-09-05
展开全部
#include <stdio.h>
#include <string.h>
int f(int a, int b) 

return (&b - &a); 

void main(){
char x[8]={0};
char y[8]={0};
strncpy(x,"Hello",sizeof(x));
strncpy(y,"Hello World",sizeof(y));

printf("%s   \n",x);
printf("%s\n",y );

int a=5,b=6;
printf("%d",f(a,b));
}

4楼回答正解 我附加个程序吧……  编译程序那会就有人答了……

 

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ishiho
2014-09-05 · 超过14用户采纳过TA的回答
知道答主
回答量:23
采纳率:0%
帮助的人:17.5万
展开全部
你哪里来的答案啊。。。我怎么感觉是错的。。。
第一题敲一下代码就知道了,应该选D
因为y在拷贝的时候缓冲区溢出,导致作为字符串结尾的‘\0’没有拷贝进去,而strlen是根据'\0'来判断字符串结束的,strlen遇到了未知的结尾,输出自然是未知了。。不过其实,在我的机器上,xy的内存连续,y虽然结尾未知,但是x有结尾,所以还是可以输出。但是这是UB,可能其他机器就不同了。
第二题答案应该是A吧,也就是相差一个地址。因为b先入栈,a后入栈,而栈由高向低,所以b比a高一个地址,地址减地址咯。
追问

第一题的答案就是敲出来的……

第二题的答案:

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
很飞钱7121
2014-09-05 · 超过80用户采纳过TA的回答
知道答主
回答量:133
采纳率:0%
帮助的人:185万
展开全部
1,
错。输出应该是0。理由是int和float存储格式不同,int占2个字节共16位;而float占4个字节占32位,其中第32位是符号位,31-23是数值位,22-1位是指数位。你可以用如下语句去理解一下float的存储格式。
date.c=1.0;
printf("%x\n",date.a);
date.c=2.0;
printf("%x\n",date.a);
date.c=-1.0;
printf("%x\n",date.a);
2,
#include<stdio.h>
main()
{ FILE *fp;int i,k=0,n=0;
fp=fopen("d1.dat","w"); //以write方式打开d1.dat。如果没有d1.dat,则在a.exe同目录下创建一个
for(i=1;i<4;i++) fprintf(fp,"%d",i); //在文件中写入123
fclose(fp); //关闭文件
fp=fopen("d1.dat","r"); //以read方式打开文件
fscanf(fp,"%d%d",&k,&n); /从文件中读出两个整数,赋值给k,n;由于123之间没有空格,于是k=123,n=0
printf("%d %d\n",k,n);
fclose(fp);
}
求采纳为满意回答。
追问
我怎么感觉你答非所问呢……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
murphyXucv
2014-09-05 · TA获得超过211个赞
知道小有建树答主
回答量:458
采纳率:0%
帮助的人:82.5万
展开全部
1.strlen()是求长度 Hello为5个字节所以长度为5 Hello World为10个字节 在加中间的空格就是11个字节 长度为11
注意区分sizeof()的区别 sizeof是求空间大小 假如是sizeof(y) 就是8
追问
问题是y定义的大小为8啊。而且复制过去的也是8个
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式