第一题
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
这里重点就在strcpy,arr[0]是数组的行,我们可以认为二维数组就是一维数组的数组
所以二维数组的行就相当于每行的数组名,arr[0] 就是第一行这个数组的数组名
arr[0] [4] 代表的是一个一维的字符数组,相当于char (arr[0]) [4];
那数组名代表首元素地址,strcpy就是从首元素位置开始copy,就如上图那样
所以以此类推,答案为A
第二题
2、如下C程序,在64位处理器上运行后 sz 的值是什么( )
struct st
{
int *p;
int i;
char a;
};
int sz = sizeof(struct st);
A: 12
B: 16
C: 24
D: 13
答案及解析 B
64位机器的指针为8字节
sizeof一个结构体类型,要考虑内存对齐的规则,相关博客:C/C++内存对齐规则(结构体、联合体、类)_clang编译器最大对齐数-CSDN博客
第三题
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
enum为枚举类型,mon赋值了3,那后续的tue和wed会依次递增,所以workday = 5
第四题
4、设有以下定义,则下面叙述中正确的是【多选】( )
union D
{
int d1;
float d2;
}d;
A: 变量d与各成员的地址相同
B: d.d1和d.d2具有相同的地址
C: 若给d.d2赋10后,d.d1中的值是10D: 若给d.d1赋10后,d.d2中的值是10
答案及解析 A B
AB:union是联合体,其地址空间大小,是最大的那个,共用同一个地址,所以起始位置都相同。
CD:这里浮点数的二进制存储和整数的二进制存储是不同的,所以读取也不同
第五题
5、假设C语言程序里使用 malloc 申请了内存,但是没有 free 掉,那么当该进程被kill之后,操作系统会( )
A: 内存泄露B: segmentation fault(段错误)
C: core dump(核心转储)
D: 以上都不对
答案及解析 D
不管程序怎么用malloc,在进程结束的时候,程序开辟的内存空间都将会被操作系统回收,不存在泄漏和错误