2017年面试题
int main(int argc, char *argv[])
{
int t = 4;
printf("%lu\n", sizeof(t--));
printf("%lu\n", sizeof("ab c\nt\012\xa1*2"));
return 0;
}
输出结果为:
4
11
分析 : t为int类型,int类型占4字节,sizeof()调用时,直接用t自减后的值,所以是4。
ab c\nt\012\xa1*2是一组字符串,ab c占4字节,,\n占1字节,、012为8进制,等价为’\n’,\xa1为1字节,*2占2字节,还包括结束符’\0’,所以一共11个。
int main(int argc, char *argv[])
{
int a = 10, b = 20, c = 30;
printf("%d %d\n", b = b*c, c = c*2) ;
printf("%d\n", printf("%d ", a+b+c));
return 0;
}
输出:
1200 60
1270 5
先执行c=c2,所以c=60,再执行b=b * c,所以b=1200。所以第一行答案为:1200 60;。
所以printf("%d",a+b+c);的值为1270;
printf函数返回值为int类型,表示被打印的字符数,1270有4个,所以返回4,但%d后有一个空格,所以返回值为5。
下面代码使用正确吗?若正确,请说明代码的作用;
若不正确,请指出错误并修改。
void get_str(char *ptr)
{
ptr = (char*)malloc(17);
strcpy(ptr, "Xiyou Linux Group");
}
int main(int argc, char *argv[])
{
char *str = NULL;
get_str(str);
printf("%s\n", str);
}
不正确
在被调函数中仅仅将 ptr 指向的内存地址变为了malloc函数申请的空间, 而主函数中的str仍指向空指针,并不会输出字符.
int main(int argc, char *argv[])
{
int a[][2] = {0, 0, 0, 0, 0, 0, 0, 0};
for(int i = 0; i <= 2; i++)
{
printf("%d\n", a[i][i]);
}
return 0;
}
输出结果为:
0
0
0
分析:
第一个0是第一个,第二个0是第四个,第三个0是第六个。
int main(int argc, char *argv[])
{
int a, b = 2, c = 5;
for(a = 1; a < 4; a++)
{
switch(a)
{
b = 99;
case 2:
printf("c is %d\n", c);
break;
default:
printf("a is %d\n", a);
case 1:
printf("b is %d\n", b);
break;
}
}
return 0;
}
输出结果:
b is 2
c is 5
a is 3
b is 2
int main(int argc, char *argv[])
{
unsigned int a = 10;
int b = -20;
if (a + b > 0)
{
printf("a+b = %d\n", a+b);
}
else
{
printf("a = %d b = %d\n", a, b);
}
return 0;
}
输出结果:
a+b = -10
分析:
int类型会转化成unsigned int类型,通过补码转化,所以a+b>0成立,所以输出结果为a+b = -10。
7.
int main(int argc, char *argv[])
{
int nums[5] = {2, 4, 6, 8, 10};
int *ptr = (int *)(&nums+1);
printf("%d, %d\n", *(nums+1), *(ptr-1));
return 0;
}
输出结果为:
4, 10
分析:*(nums + 1)是将该数组的第二个元素取出,所以答案为4
(&nums+1)是将与该数组相同类型的下一个数组的地址取出,既nums[5]的地址,(int *)(&nums+1)是将nums+1变为int型的指针,再赋给 *ptr, *(ptr - 1)等价于 *nums[4],既输出为10.
int main(int argc, char *argv[])
{
while(1)
{
fprintf(stdout, "Group ");
fprintf(stderr, "XiyouLinux");
getchar();
}
return 0;
}
Linux输出结果
XiyouLinuxGroup
Windows输出结果
Group XiyouLinux
stdout – 标准输出设备 stdout。
stderr – 标准错误输出设备。
stdout输出到磁盘文件,stderr在屏幕。
stdout是行缓冲的,他的输出会放在一个buffer里面,只有到换行的时候,才会输出到屏幕。而stderr是无缓冲的,会直接输出。
黄色部分均是在Linux下,而在Windows下,两者都默认无缓冲。