前言
通则康威笔试线上
记录于2023年8月16日
面试是软件工程师(wins和linux下的C语言)
试题有四部分,不限时但只能做180mins;
一、选择题(15道)
*1.若二维数组 arr[0.M-10…N-11]的首地址为 base,数组元素每个元素占用 K 个存储单元则元素
arr [i i] 在该数组空间的地址为_____
2.若有定义: int a=2018,b=2017;则以下表达式中,值为真的是_____
*3.在以大端方式存储的系统中有以下定义typedef uion{
fint a;
char b[4];
}X;
X test;
test.a=0x11223344
则test.b[1]的值为_____
*4.c 语言中下列运算符的优先级按照由低到高的次序(其中&代表按位与),正确的是
A.(1)! (2)+ (3)< (4)& (5)&&
B.(1)&& (3)+ (3)< (4)& (5)!
C.(1)! (2)&& (3)& (4)< (5)+
D.(1)&& (2)& (3)< (4)+ (5)!
*5.若有定义int x[6][4],(p)[4];
p =x;
则(p+2)指向_____的地址
6.下面判断正确的是 ( )
A.char s=“china”.等价于 chars;s=“china”
B.char c[4]=“abcd[4]=“abc”,等价于 char c[4]=d[4]=“abc”
C.chara=“china”等价于 chara;*a=“china”
D.char str[10]=[“china”;等价于 char str[10]; str[ ]=f“china”;
*7.若有以下定义:
int func(int a)
{
int b = a;
switch (a)
{
case 1: b = 0;
case 2: b = 16;
default: b = 30;
}
return b;
}
则func(1)的值为____
解:我做的答案是30,可网上很多答案都是0,原因是没有break();别人是defalt : b = 0; 这里的defalt: b = 30;想着用VS算一下,看来不太行,暂时不想去补齐这段代码。
*8.若用数组名作为函数调用的实参,传递给形参的是
A.数组的首地址
*9以下哪个IP不与10.73.48.91/28处于同一个子网 B_
A.10.73.48.94/28
B.10.73.48.97/28
C.10.73.48.82/28
D.10.73.48.88/28
*10.设有如下定义:
int (*ptr)( );
则以下叙述中正确的是 C
A.ptr是指向函数的指针变量,该函数返回一个int型数据
B.ptr是指向函数的指针变量,该函数返回一个int型数据
C.ptr是一个函数名,该函数的返回值是指向int型数据的指针
D.ptr是指向int型数据的指针变量
11.定义一个结构体需4字节对齐,则应填入的V1,V2,V3,V4,V5,V6值为____
#define PADS(x,y) char pad##x[y]
typedef struct
{
short a;
PADS(V1,V2);
char b[3];
PADS(V3,V4);
charp;
PADS(V5,V6);
}ST_TEST;
A.1,2,3,1,4,1
B.2,2,2,1,0,0
C.3,2,4,1,0,5
D.3,2,1,1,2,0
解:我做的是A,网上给的答案是1,2,3,4,5,6,…无语有点;
*12.在一个32 位系统中,定义一个变量 char *filesl=“f1”,“f2”,“f3”,“f4”;,则files 占用内存大小为_____字节。
A.4
B.8
C.12
D.16
解:D,本题考查编程语言方面的知识。变量files是包含4个字符型指针的数组变量,在32位系统中,一个字符型指针占用4个字节的空间,所以files共占用16个字节的内存空间。(回头看着题目时感觉我好像没做…)
- 13.已知两段代码
程序段 1:
#define f(x) x*x
float x, y1;
x = 2.0;
y1 = x/f(x);
程序段 2:
#define f(x) (x*x)
float x, y2;
x = 2.0;
y2 = x/f(x);
其运行结果是__A___
A.y1=2.0, y2=0.5
B.y1=2.0, y2=1.0
C.y1=1.0, y2=2.0
D.y1=0.5,y2=2.0
14.以下说法错误的有__B___
①Dx41’和N101是完全等价的。
②设定义char p =“tozed”,则(p+3)与p[3]是完全等价的。
③局部变量可以和全局变量重名,编译的时候不会出现错误,但一旦不小心,就可能导致使用错误变量,所以在定义局部变量的时候不要和全局变量重名
A.无
B.①
C.①②
D.①②③
解:我就看第一个对了,后面的没仔细想
15.OPERATION(ST TEST,c)结果为____
#define OPERATION(X,Y)
((long)(&(((X*)0)->Y)))
typedef struct
{
long a;
char b[12];
long c[100];
}ST_TEST;
A.13
B.16
C.416
D.会导致异常退出
解:好难乱选了
————————————————————————————————————————————
光录这15道选择题也要花我50分钟,努努力全录了加油、加油(ง •̀_•́)ง
————————————————————————————————————————————
二、问答题
*16.1、继续完成以下代码,使得程序能正常编译通过并运行正常; (8分)
(1)完成结构体初始化,将name初始化为“TZKW BASE”,serialNum初始化为0x83;
(2)已知a的值等于给定结构体中serialNum的值先按位左移3位,然后按位与0x58,最后再异或0x110,写出C语句完成a的赋值;
(3) 手动计算给出最后a的值。
typedef struct
{
char *name;
int serialNum;
}TZKW_loT,*PTZKW IoT;
int main()
{
int a = 0;
PTZKW_loT ploT =(PTZKW loT)malloc(sizeof(TZKW loT));
//TODO
解:这题不难,只是我做的少,没仔细看。
*17.请按以下描述,使用C语言写出a 的定义语句:(8分)
1.整型变量a,用于保存整型数据:
2.指针a,存放一个整型变量的地址:
3.指针a,存放一个整型指针的地址;
4.存放10个元素的数组a,元素类型是整型变量;
5.存放10个元素的数组a,元素类型是整型指针;
6.指针a,存放一个“存放10个元素且元素类型是整型变量的数组”的地址;
7.指针a,存放一个“返回值为整型且形参为整型的函数”的地址;
8.存放10个元素的数组a,元素类型是返回值为整型且形参为整型的函数指针
*18.简述00、0和 NULL 各自的作用和区别,在系统内存中,他们实际存储的数据是否相同? (8分)
- 19.下面代码的输出结果是多少? 为什么? (6分)
int main()
{
signed char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a [i] = -1 -i;
}
printf(“%d”, strlen(a));
return 0;
}
解:用VS
20.回答下列问题 (4分)
(1) static全局变量与普通的全局变量有什么区别?
(2) static局部变量和普通局部变量有什么区别?
(3) 内联函数与普通函数有什么区别,一般在什么场景下使用?
解:(算比较简单)
*21.请指出下面程序所有可能出现的错误。(4分)
void main()
{
int x,y;
int *ptr;
char *str;
*ptr=8;
y = 8358300000;
ptr=y;
if(*ptr = 3)
strcpy(str, "This is a test");
return 0;
}
解:有四个错!!!
*22.写出下面的程序的执行结果。 (4分)
typedef struct{
short a;
char b[3];
char* p;
unsigned char c;
}tTest;
int main(int argc, char *argv[])
{
char *pStr;
char szDatal="tozed"
pStr =(char*)szData;
printf("%d,%d,%d,%d,%dn",sizeofpStr),sizeof(szData),strlen(pStr),strlen(szData);
sizeof(tTest));
return 0;
}
*23.写出运行结果和原因。(4分)
typedef struct{
int x;
}tT;
void modify struct(tT t)
{
t.x = 5;
}
void test struct(void)
{
tT t;
t.x = 1;
modify struct(t);
printf("x=%dn", t.x);
}
char * test_ptr(int n)
{
char p10="123";
char *p2="456";
if(n==0)
return p1;
else
return (char *)p2;
}
int main(int argc, char *argv[])
{
test struct() ;
printf("test1=%sin", test ptr(1));
printf("test0=%sln", test_ptr(0));
return 0;
}
解:这题主打的一个又臭又长,只好被我放到最后录,想着不录算球,但想在第一次记录,意在齐全。
*24.下面的程序实际在32位系统中运行,会输出什么? 为什么? (4分)
int main()
{
char a[8] = [5,5,5,5,5,5,5,5];
short b = ((short)&a[3]);
printf(“b=%hd\n”, b);
return 0;
}
*25.按要求在linux系统环境下,分别写出一行shell命令实现以下效果:(5分)
(1) 查看当前系统进程详细信息;
(2) 在/test/目录下找到名字为test.txt的文件,并打印出其路径;
(3)打印出/test/目录下以.txt结尾的文件有多少个;
(4)将/test/tmp/test.txt文件中,所有的“tozed_”字符串修改为“tzkw ”;
(5) 运行当前路径下的命令test,并以追加方式将普通输出保存至/tmp/test.txt,错误输出保存至/tmp/error.txt;
三、编程题(2×30分+5分)
*26.编写shell脚本,从标准输入接收一个正整数n, 并从0开始一直打印到n。(5分)
*27.完成下面的函数,实现英文句子翻转并打印的功能 (除printf之外不能使用其它库函数(15分)
例如:
(1) char *string=“hello world”,则输出“world hello”
(2) char *string=“l have done some great job”, 则输出“job great some done have I "int revert english(const char *string)
*28.单链表的节点声明如下,请编写一个子函数,将单链表反转,并在反转前后遍历链表将key的值打印出来。(15分)
代码如下(示例):
typedef structf{
int key;
ListNode * next:
}ListNode,*pListNode;
四、附加题
*29.现有源码包app,目录结构如下
其中src/app.c为可执行程序app的源码,app依赖库libapp, lib/libapp.c为libapp的源码,请分别实现其中两个makefile:
(1) lib下Makefile, 使用gcc编译出libapp.so动态库;
(2) app下Makefile,使用gcc编译app可执行程序做好依赖关系。
总结
全程记录花了我50+40分钟(这时间除了选择题),太累了