C语言面试题记录<一>


前言

通则康威笔试线上
记录于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.char
a=“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);
char
p;
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分钟(这时间除了选择题),太累了

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SingsonLu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值