【08】华汉伟业——华汉伟业 嵌入式 C笔试,校招,题目记录及解析

发布于:2025-08-14 ⋅ 阅读:(21) ⋅ 点赞:(0)

华汉伟业——华汉伟业 嵌入式 C笔试,校招,题目记录及解析

华汉伟业——华汉伟业 嵌入式 C笔试,校招,题目记录及解析

3 请写出以下代码在小端CPU的运行结果:

C,运行多次都是cccca55a,故xxxx应该是确定的

typedef union {
	long value;
	struct{
		char a;
		char b;
	}v;
}Type;

void main() {
	Type t;
	t.v.a = 0x5A;
	t.v.b = 0xA5;
	printf("value=%x\n", t.value);
    printf("sizeof(t.value)=%d\n", sizeof(t.value));//测试,自己加的
}
A输出结果:value=xxxxa55a,其中xxxx为不确定
B输出结果:value=xxxxA55A
C输出结果:value=xxxxa55a
D.输出结果:value=xxxxA55A,其中xxxx为不确定

前四位,运行多次,都是cccc,换另一台电脑输出还是一样;
在这里插入图片描述
输出8位的原因是,t.value是long型,4个字节,16进制每两位一个字节。
如果,输出是t.v是一个结构体(两个char组成),2个字节,输出4位a55a;

typedef union {
	long value;
	struct{
		char a;
		char b;
	}v;
}Type;

struct {
	char c;
	char d;
}v2;

void main() {
	Type t;
	t.v.a = 0x5A;
	t.v.b = 0xA5;
	printf("value=%x\n", t.v);
	printf("sizeof(t.v)=%d\n", sizeof(t.v));


	v2.c = 0x5A;
	v2.d = 0xA5;
	printf("value=%x\n", v2);
	printf("sizeof(v2)=%d\n", sizeof(v2));
}

在这里插入图片描述

4.下列转义字将中错误的是

D

A.'\2'
B. '\14'
C.'\1000'
D.'\x111'

不合法,
x代表16进制,一个char长度8位,也就是两位16进制数,你这都三位了。

6 表达式"100"+88" =

C

A.188
B.100+88
C.10088
D. 88100

8.以下关于 static关键字描述正确的是?

ABCE (不确定)

A.C++在类中修饰成员函数。该成员函数限于类实例存在而存在,且只能访问静态成员。
B.c/c++在文件中,使用 static修饰全局变量。该全局变量的作用域改变,只能该文件内访问.
C.c/C++在文件中,使用 static修饰函数。该函数的作用域改变,只能该文件内访问。
D.C++在类中修饰成员变量,该成员变量还需要在类外再声明一次。无论该类的实例有多少个,所有
实例共享一个该成员变量实例。且该成员变量先于类的实例而存在。
E.c/c++在函数内部,使用static修饰同部变量。该变量的生命周期产生变化,并不以复合语句结而结束,其生命与进程相同。

static的用法

9.设float a = 2, b = 4, c =3;,以下C语言表达式与代数式(a+b)+c计算结果不一致的是

D

A.(a+b)/2*c
B.c/2*(a+b)
c.(a+b)*c/2
D.(1/2)*(a+b)*c
	float a = 2, b = 4, c =3;
	float d = (a + b) + c;

	float A, B , C , D;
	A = (a + b) / 2 * c;
	B = c / 2 * (a + b);
	C = (a + b)* c / 2;
	D = (1 / 2)* (a + b)* c;

	printf("%f\n", d);
	printf("%f\n", A);
	printf("%f\n", B);
	printf("%f\n", C);
	printf("%f\n", D);

在这里插入图片描述

10 在Linux中也提供了一组函数接口用于使用共享内存,它们声明在头文件sys/shm.h中,关于以下函数描述正确的是?

BD

A.shmdt函数用来控制共享内存
B.shmget函数用来创建共享内存
C.shmctl函数该函数用于将共享内存从当前进程中分离
D.shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间

共享内存API

shmget——创建/打开共享内存
shmat——将共享内存与当前进程相关联
shmdt——将当前进程与共享内存间脱离关联
shmctl——操控共享内存

11.已知二叉树后序遍历序列为showmebug,中序遍历序列为sohwgemub,它的前序遍历序列为

C

A  gwohsuemb
B. gwoshuebm
C. gwoshuemb
D. gwsohuemb

在这里插入图片描述

12 请写出以下代码的运行结果:

B

#pragma pack(push, 1)

typedef struct tagNode{
	short a;
	short b; 
	long c; 
	long *d;
	struct tagNode* next;
}TNode;

#pragma pack(pop)

int main(int argc, char* argv[]){
	TNode *node = (TNode*)0x3000000; 

	printf("%x, %x, %x, %x, %x\n",
			&node->a, &node->b,
			&node->c, &node->d, node->next); 

	return(0);
}

在这里插入图片描述

运行出错

printf("%x\n", &node->a);
printf("%x\n", &node->b);
printf("%x\n", &node->c);
printf("%x\n", &node->d);
printf("%x\n", &node->next);//取地址,否则错
printf("%x\n", node);

在这里插入图片描述

#pragma pack (n)            作用:C编译器将按照n个字节对齐。
#pragma pack ()             作用:取消自定义字节对齐方式。

#pragma  pack (push,1)     	作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐
#pragma pack(pop)          	作用:恢复对齐状态

14 则表达式2*(N + Y(5+1) )的值是

D

#define N 3
#define Y(n) ((N + 1)*n)
A. 54
B.出错
c.42
D.48

15 请指出以下代码的问题,并选择描述正确的选项

ABD

//c
int gFlag=O;//全局变量
//线程1:
void func1()
{
	//...
	while(!gFlag);
	//..
}
线程2:
void func2()
{
	//...
	gFlag = 1;
	//...
}
//c
A.volatile 关键字告诉编译器,不要使用寄存器中的备份变量用于计算。
B.这段代码有时候能正确运行,有时候不能正确的运行。
C.int gFlag = 0 应该修改:volatile int gFlag = 1;
D.int gFlag = 0 应该修改:volatile int gFlag= 0;

16.若变量已正确定义,表达式(j=3,j++)的值是

A

A.3
B.4
c. 5
D.0
	int j;
	int c = (j = 3, j++);
	printf("%d\n",c);

在这里插入图片描述
逗号表达式,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。

3+5,6+8)的值是14;
a=(a=35,a4)的值是60,其中(a=35,a4)的值是60, a的值在逗号表达式里一直是15,最后被逗号表达式赋值为60,a的值最终为60。

上述是有括号,整个表达式的值,逗号表达式本身不难,常常与赋值运算符一起考,易错

main()
{
int x,y,z;
x=1;
y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z);
}

2,3,1,
z = 1 ? 因为 "=“优先级比”,"运算符级别高,
故 z=x++,y++,++y; 等价于 (z=x++),y++,++y;
在这里插入图片描述
如果,逗号表达式整体括号,那么 z = 3

z = (x++, y++, ++y);

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

17 C语言中,下列运算符优先级最高的是

D

A.==
B.>>
c.%
D.!

18 以下关于堆与栈的区别描述正确的是

ABCD

A堆的空间使用malloc/new 和 free/delete申请释放,程序员手动管理;
B堆是向高地址扩展的数据结构,是不连续的内存区域
C.栈是向低地址扩展的数据结构,是一块连续的内存区域
D栈是在函数调用过程中用于存储局部变量等的存储空间,由编译器自动生成代码管理。

在这里插入图片描述

堆区:动态申请内存用。从低向高 地址扩展的数据结构,是不连续的内存区域。
栈区:存储局部变量、函数参数值。栈从高地址向低地址增长。是一块连续的空间。

怎么判断数据分配在栈上还是堆上: 首先局部变量分配在栈上;而通过malloc和new申请的空间是在堆上。

对堆栈中分析的比较好的文章进行的总结

申请响应

  • :只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示 栈溢出。
  • :首先应该知道操作系统有一个记录空闲 内存地址的 链表,当系统收到程序的申请时,会遍历该链表,寻 找第一个空间大于所申请空间的堆结点,然后将 该 结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于 大多数系统,会在这块内存空间中的 首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲 链表中。

申请限制

  • :在Windows下, 栈是 从高向低 地址扩展的数据结构,是一块连续的内存的区域。 这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

  • :堆是 从低向高 地址扩展的数据结构,是不连续的内存区域。这是由于系统是用 链表来存储的空闲 内存地址的,自然是不连续的,而 链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的 虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

效率比较

  • 由系统自动分配,速度较快。但程序员是无法控制的。
  • 是由new分配的内存,一般速度比较慢,而且容易产生 内存碎片,不过用起来最方便.

19 以下关于多态、继承、私有成员如何使用C++语言实现描述正确的是?

BC (A不确定)

A继承采用结构体强制类型转换的办法。基类(结构体)作为派生类(结构体)的第一个成
员变量。
B.多态分为三种,一是模板类和模板函数;二是函数重载;三是虚函数。
C.一个类占用一个文件,私有函数和私有变量采用static关键字修饰,即限制了变量和
函数的访问范围。
D模板类和函数重载可以通过函数指针进行强制转换实现。

一个全局变量被关键字static修饰,改变了变量可见性,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

一个函数被关键字static修饰,改变了函数可见性,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

21 关于c/c++中 const关键字描述正确的是?

ABCD

A const int*ptr;修饰指针指向的内容是常量,不能被改变;
B. const int value:值不能被改变。
c.const int *function();修饰函数返回指针的内容不能被改变
D.int *const ptr;修饰指针指向的地址是常量,不能被改变;

24 表达式 strcmp(" 3.14".”3.278“)的值是一个

D

A浮点数
BO
c字符
D非零整数

strcmp()

当s1<s2时,回到为负数;

当s1=s2时,传参= 0;

当s1>s2时,回到正数。

25 数组定义为"int a[4];”,表达式()是错误的。

B

a是const int *不能自加

A.*a
B. a++
C.a[0]

26 执行活句k=7>>1后, k的当前值是

表示将整数7按位右移一位:0111变成0011所以变成3。
也可以理解为将7整除于2,得到3。
在这里插入图片描述

28 执行以下程序输出的结果是?

A

char b[] = "ABCDEF"; 
void main() {
	char* bp;
	for (bp = b; *bp; bp += 2)
		printf("%s",bp);
	printf("\n");
}
A.ABCDEFCDEFEF
B. ABCDEFABCDEF
c ABCDEFCDEFCD
DABCDEF

网站公告

今日签到

点亮在社区的每一天
去签到