文章目录

  • 写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
  • 写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
  • 选择题--文件相关
  • 选择题--文件相关
  • 选择题--内存分配相关
  • 选择题--内存分配相关
  • 填空题--位段
  • 选择题--位段
  • 选择题--联合体
  • 选择题--联合体

写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

#define SWAP(x) ((x) & 0x55555555) <<1 | ((x) & 0xaaaaaaaa ) >> 1

交换奇偶位,需要先分别拿出奇偶位。既然是宏,分别拿出用循环不是很现实,那就用&这些位的方式来做。奇数位拿出,那就是要&上010101010101……,偶数位拿出,就是要&上101010101010……,对应十六进制分别是555……和aaa……,一般我们默认是32位整数,4位对应一位16进制就是8个5,8个a。通过& 0x55555555的方式拿出奇数位和& 0xaaaaaaa的方式拿出偶数位。奇数位左移一位就到了偶数位上,偶数位右移一位就到了奇数位上,最后两个数字或起来,就完成了交换。

※这个宏只能完成32位以内的整形,要想完成64位的,那就将5和a的数量翻倍即可。


写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明

考察:offsetof宏的实现

#define offsetof(StructType,MemberName)  (size_t)&(((StructType*)0)->MemberName);

StructType是结构体类型名,MemberName是成员名。具体操作方法是:

1、先将0转换为一个结构体类型的指针,相当于某个结构体的首地址是0。此时,每一个成员的偏移量就成了相对0的偏移量,这样就不需要减去首地址了。

2、对该指针用->访问其成员,并取出地址,由于结构体起始地址为0,此时成员偏移量直接相当于对0的偏移量,所以得到的值直接就是对首地址的偏移量。

3、取出该成员的地址,强转成size_t并打印,就求出了这个偏移量。


选择题–文件相关

  1. C语言中关于文件读写函数说法不正确的是:( B)

A.fgetc是适用于所有输入流字符输入函数
B.getchar也是适用于所有流的字符输入函数
C.fputs是适用于所有输出流的文本行输出函数
D.fread是适用于文件输入流的二进制输入函数


B选项中,getchar只针对标准输入流stdin。即使对stdin重定向,getchar针对的也只是stdin。
f系列的输入输出函数都是作用于所有流的的,所以AC没问题;
D的表述也没问题,fread做的就是二进制的活。


选择题–文件相关

下面程序的功能是什么?  ( B)
A.拷贝文件
B.统计文件的字符数
C.统计文件的单词数
D.统计文件的行数
int main()
{ long num=0;FILE *fp = NULL;if((fp=fopen("fname.dat","r"))==NULL){printf("Can’t open the file! ");exit(0):}while(fgetc(fp) != EOF){ num++;}printf("num=%d\n",num);fclose(fp);return 0;
}

程序只通过只读方式打开了一个文件,所以A排除;
文中使用的fgetc,且没有’ ‘和’\n’相关的统计,所以排除CD,直接选B。


选择题–内存分配相关

关于下面代码描述正确的是( C)
A.printf函数使用有问题
B.程序正常打印hello world
C.GetMemory函数的地址无法正常使用
D.程序存在内存泄露

char *GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char *str = NULL;str = GetMemory();printf(str);
}

说明:此题考的是“局部变量的指针不能做返回值,因为子函数的空间此时已经被释放了”这一点。
只有C说到点子上了。
A虽然有一定道理,但是printf这样用也可以,只是不规范。
B选项打印结果其实是不确定的,更谈不上正常。
D比较离谱,程序中并没有分配空间。


选择题–内存分配相关

void GetMemory(char *p)
{p = (char *)malloc(100);
}
void Test(void)
{char *str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);
}

关于下面代码描述不正确的是:A
A.上面代码没问题
B.上面代码存在内存泄露
C.上面代码可能会崩溃,即使GetMemory函数返回,str依然为NULL
D.GetMemory函数无法把malloc开辟的100个字节带回来


BCD已经说明了问题。核心问题就是子函数中的p是临时变量,改变它并不会改变主函数中的str。


填空题–位段

有如下宏定义和结构定义

#define MAX_SIZE A+B
struct _Record_Struct
{unsigned  char Env_Alarm_ID :4; //占第一个字节的前4位 unsigned  char Para1 :2; //占第一个字节的前第5、6位unsigned  char state; //占第二个字节的全部unsigned  char avail:1; //占第三个字节的前1位
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc
(sizeof(struct _Record_Struct) * MAX_SIZE);

当A=2, B=3时,pointer分配( 9)个字节的空间


这里涉及到的位段成员,一个位域必须存储在同一个字节中,不能跨两个字节。
说明:结构体向最长的char对齐,前两个位段元素一共4+2位,不足8位,合起来占1字节,最后一个单独1字节,一共3字节。另外,#define执行的是查找替换, sizeof(struct _Record_Struct) * MAX_SIZE这个语句其实是3*2+3,结果为9


选择题–位段

下面代码的结果是( B)
A.02 03 04 05
B.02 29 00 00
C.02 25 00 00
D.02 29 04 00

int main()
{unsigned char puc[4];struct tagPIM{unsigned char ucPim1;unsigned char ucData0 : 1;unsigned char ucData1 : 2;unsigned char ucData2 : 3;}*pstPimData;pstPimData = (struct tagPIM*)puc;memset(puc,0,4);pstPimData->ucPim1 = 2; pstPimData->ucData0 = 3;pstPimData->ucData1 = 4;pstPimData->ucData2 = 5;printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);return 0;
}

puc是一个char数组,每次跳转一个字节,结构体不是,它只有第一个元素单独享用一字节,其他三个元素一起共用一字节,所以puc被结构体填充后,本身只有两个字节会被写入,后两个字节肯定是0,至此AD排除,然后第一个字节是2就是2了,第二个字节比较麻烦,首先ucData0给了3其实是越界了,1位的数字只能是0或1,所以11截断后只有1,同理ucData1给的4也是越界的,100截断后是00,只有5的101是正常的。填充序列是类似小端的低地址在低位,所以排列顺序是00 101 00 1。也就是0010 1001,即0x29,故选B。


选择题–联合体

下面代码的结果是:( )
A.14
B.4
C.16
D.18

#include <stdio.h>
union Un
{short s[7];int n;
};
int main()
{printf("%d\n", sizeof(union Un));return 0;
}

结构体向int对齐,7个short一共是14字节,对齐后是16字节。n是单独的4字节,由于是union,所以n与s共用空间,只取最长的元素,故占用16字节


选择题–联合体

在X86下,有下列程序
输出结果是( A)
A.3839
B.3938
C.380039
D.不确定
#include<stdio.h>
int main()
{union{short k;char i[2];}*s, a;s = &a;s->i[0] = 0x39;s->i[1] = 0x38;printf(“%x\n”,a.k);return 0;
}

union只有2字节,2字节的十六进制只有4位,所以答案CD排除。而位顺序类似小端,低地址在低处,所以39是低地址,在低位,38在高位,所以是3839,故选A。


【C语言】常见面笔试题(10道)相关推荐

  1. hadoop job 数量_大数据Hadoop常见面/笔试题

    1. namenode的重要性是什么? namenode的作用在Hadoop中非常重要.它是Hadoop的大脑,主要负责管理系统上的分配块,还为客户提出请求时的数据提供特定地址 2. 当NameNod ...

  2. c语言while中100 95,C语言笔试题100道

    C语言笔试题100道 a) 30 b) 50 c) 40 d) 20 e) 10 18) #include void main() { int a=3,b=2,c=1; int x=10,y=20; ...

  3. mysql笔试题15道

    (93条消息) mysql笔试题18道_bubbleJessica的博客-CSDN博客 19.列出最低薪资大于1500的各种工作及从事此工作的全部雇员人数 SELECT JOB,COUNT(*) FR ...

  4. C语言经典面试笔试题

    总结几道C语言经典面试笔试题,涉及联合体,位段,大小端等知识点,有兴趣的可以刷刷. 1.联合体大小问题 2.联合体+大小端问题 3.形参与实参关系+内存开辟问题 4.位段使用问题 5.返回栈空间地址问 ...

  5. linux c语言常见面试题及答案,Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享) 本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正. 1.如果在Linux下使用 ...

  6. 1000道C语言和C++语言的练习题笔试题及答案 #0000-0050

    汇集1000道C语言和C++语言的练习题 (例题.笔试题.编程题.算法设计题),由我亲自配上答案(点此查看). 语法题我就不出了,那个没意思,看书就可以了. 本贴汇集50题 (0000-0050),持 ...

  7. 计算机考研复试C语言常见面试题

    本文是我2021年考研时准备的复试面试题,现在拿出来给大家分享一下 觉得好的点个赞哦,毕竟当初我也是整理了好久,改了好几次版本呢 祝大家都上岸!!!! P.S. 我当初整理的时候是word,直接复制过 ...

  8. 校招笔试C语言,校招c ++笔试题汇总

    ①链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题, 最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后 ...

  9. C语言进阶——指针笔试题图解

    作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:C语言从入门到进阶 语录:Stay hungry stay foolish 笔试题1: int main() { int a[5] = { 1, 2 ...

  10. C语言必须会写的10道经典题(小白必看!)

    对于初学C语言的小白们来说,提高进步最快的方式无疑是刷题,反复刷反复思考优化,这里给大家列出几道C语言入门经典好题,对于小白们锻炼思维很不错,下面就一起来看看吧~ 文章目录 前言 1.写代码将三个整数 ...

最新文章

  1. java 外部类似_[求指点] 如何用java 实现类似linux中管道调用外部程序的功能
  2. 2017 [六省联考] T5 分手是祝愿
  3. 动态规划----解121. 买卖股票的最佳时机---最大连续子序列和
  4. openresty开发系列39--nginx+lua实现接口签名安全认证
  5. Caffe学习系列(13):对训练好的模型进行fine-tune
  6. 关于设计模式--我有话说
  7. 移除添加的文件_文件压缩教程-文件批量压缩
  8. ***学习笔记教程五:***技术
  9. 做到这4点,才是真正的持续交付| 研发效能提升36计
  10. 前台等待事件 oracle,Oracle等待事件之buffer busy waits
  11. 零基础学python全彩版-零基础轻松学Python:青少年趣味编程(全彩版)
  12. c语言链表的数据结构,c语言实现通用数据结构(一):通用链表
  13. Visual Studio 2019 集成CefSharp
  14. MyEclipse10破解工具,crack下载
  15. 个人永久性免费-Excel催化剂功能第69波-专业图表库新增图表-刘万祥老师中国地图...
  16. PMP认证考试答题应试技巧
  17. layui常用审核弹窗
  18. [BJDCTF 2nd] Web复现 wp
  19. Mina State machine状态机讲解
  20. armbian ubuntu 桌面_香蕉派BPI-M2Z刷基于Ubuntu16.04的Armbian桌面系统

热门文章

  1. johnson 算法 贪心
  2. 【集合论】集合概念与关系 ( 真子集 | 空集 | 全集 | 幂集 | 集合元素个数 | 求幂集步骤 )
  3. 苹果手机越狱后cydia的问题Could not open file - open
  4. Linux快速入门之文件操作(01)
  5. 泰牛PHP基础+高级+实战+全套课件(大牛班)
  6. 从VBA到VSTO的一些想法
  7. Centos中jdk安装及环境变量配置
  8. 使用makefile生成.so文件
  9. 莫烦python sklearn笔记
  10. 微信支付一面(C++后台)