请教两道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呢? 展开
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呢? 展开
展开全部
此题的正确答案不应该是C而应该是D。因为y的最大长度为8,sizeof(y)自然是8,向y里拷进8个字符后就把'\0'覆盖了,这个字符串就没有了结束符'\0',所以strlen(y)大于等于8的任何数都是可能的。
此题的正确答案应该是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。
更多追问追答
追答
那显然就是标准答案错了。在你提供的这种变量长度机制下,对齐方式是4为倍数,而int恰为4,所以相邻两个变量的地址只可能差1。
第一题你就没有琢磨我说的大于等于8……,凡是>=8的结果都可能出现。为了验证,你可以在char y[8]={0};前加一个声明,比如int tmp=123,情况可能会有变化……
2014-09-05
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你哪里来的答案啊。。。我怎么感觉是错的。。。
第一题敲一下代码就知道了,应该选D
因为y在拷贝的时候缓冲区溢出,导致作为字符串结尾的‘\0’没有拷贝进去,而strlen是根据'\0'来判断字符串结束的,strlen遇到了未知的结尾,输出自然是未知了。。不过其实,在我的机器上,xy的内存连续,y虽然结尾未知,但是x有结尾,所以还是可以输出。但是这是UB,可能其他机器就不同了。
第二题答案应该是A吧,也就是相差一个地址。因为b先入栈,a后入栈,而栈由高向低,所以b比a高一个地址,地址减地址咯。
第一题敲一下代码就知道了,应该选D
因为y在拷贝的时候缓冲区溢出,导致作为字符串结尾的‘\0’没有拷贝进去,而strlen是根据'\0'来判断字符串结束的,strlen遇到了未知的结尾,输出自然是未知了。。不过其实,在我的机器上,xy的内存连续,y虽然结尾未知,但是x有结尾,所以还是可以输出。但是这是UB,可能其他机器就不同了。
第二题答案应该是A吧,也就是相差一个地址。因为b先入栈,a后入栈,而栈由高向低,所以b比a高一个地址,地址减地址咯。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
}
求采纳为满意回答。
错。输出应该是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);
}
求采纳为满意回答。
追问
我怎么感觉你答非所问呢……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.strlen()是求长度 Hello为5个字节所以长度为5 Hello World为10个字节 在加中间的空格就是11个字节 长度为11
注意区分sizeof()的区别 sizeof是求空间大小 假如是sizeof(y) 就是8
注意区分sizeof()的区别 sizeof是求空间大小 假如是sizeof(y) 就是8
追问
问题是y定义的大小为8啊。而且复制过去的也是8个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询