数据结构经典测试题5

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);
}

注意:这道题是二进制的奇数位和偶数位的交换,只需要把偶数位左移一位,把奇数位右移一位即可

谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c23856

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值