1.
int main()
{
char arr[2][4];
strcpy (arr[0],"you");
strcpy (arr[1],"me");
arr[0][3]='&';
printf("%s \n",arr);
return 0;
}
上述代码输出结果是什么呢?
A: you&me B: you C: me D: err
答案为A
因为arr是一个2行4列的二维数组,每一行可以存放最多三个字符的字符串。执行strcpy(art[0],"you”);后则将字符串"you”放 置在数组arr的第一行上,即a[0][0]=’y’,a[0][1]=’o’,a[0][2]=’u',a[0][3]=’\0’(字符串结尾符),执行strcpy(arr[1],”me”);后则将 字符串”me”放置在数组arr的第二行上,即a[1][0]=’m',a[1][1]=’e’,a[1][2]=’\0’(字符串结尾符),由于二维数组在内存中是以 行序存放的,执行arr[0][3]=’&’;语句后,第一行与第二行将被视为一个字符串"you&me”,而数组名则是该字符串的首地 址。
2.
struct st
{
int *p;
int i;
char a;
};
int sz = sizeof(struct st);
上述C程序,在64位处理器上运行后 sz 的值是什么( )
A: 12 B: 16 C: 24 D: 13
答案为B
要注意的是64位的情况下指针是占8个字节的,剩余详细了解结构体内存对齐的规则.
3.
enum weekday
{
sun,
mon = 3,
tue,
wed
};
enum weekday workday;
workday = wed;
printf("%d\n",workday)
上述代码输出结果是什么呢?
A: 3 B: 4 C: 5 D: 编译错误
答案为C
因为mon给了初始值3,之后的成员会在此基础上递增。
4.
union D
{
int d1;
float d2;
}d;
设有以下定义,则下面叙述中正确的是【多选】( )
A: 变量d与各成员的地址相同
B: d.d1和d.d2具有相同的地址
C: 若给d.d2赋10后,d.d1中的值是10
D: 若给d.d1赋10后,d.d2中的值是10
答案为AB
虽然d1,d2地址相同,但存储的是二进制,浮点型的10和整型的10,二进制是不同的,所以读取出来的结果也是不同的,故 CD错误。
5.
假设C语言程序里使用 malloc 申请了内存,但是没有 free 掉,那么当该进程被kill之后,操作系统会( )
A: 内存泄露 B: segmentation fault C: core dump D: 以上都不对
答案为D
不管用户程序怎么用malloc,在进程结束的时候,用户程序开辟的内存空间都将会被回收。
6.
配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位 2与位3交换,以此类推)。
示例: 输入:num = 2(或者0b10) 输出 1 (或者 0b01) 输入:num = 3 输出:3
int exchangeBits(int num){
int odd = 0b10101010101010101010101010101010;//保存偶数位
int even = 0b01010101010101010101010101010101;//保留奇数位
odd &= num;
even &= num;
//偶数位右移一位变成奇数位,奇数位左移一位变成偶数位,然后相加即可
return (even<<1) + (odd>>1);
}
注意:这道题是二进制的奇数位和偶数位的交换,只需要把偶数位左移一位,把奇数位右移一位即可