此题的正确答案不应该是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。
#include
#include
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楼回答正解 我附加个程序吧…… 编译程序那会就有人答了……
你哪里来的答案啊。。。我怎么感觉是错的。。。
第一题敲一下代码就知道了,应该选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
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