大华嵌入式软件开发工程师笔试 9-17
《嵌入式软件开发笔试与面试手册》:https://blog.nowcoder.net/zhuanlan/jvN8gj
《嵌入式软件笔试-2023年真题汇总》:https://blog.nowcoder.net/zhuanlan/0oDWVm
单选题
1.语句switch(c)中的c不能是哪种数据类型()
char
char*
time_t
unsigned long long
解释:char* - 指针类型,不能作为 switch 表达式。
2.下列函数中,可以作为虚函数的是:
全局静态函数
普通成员函数
静态成员函数
构造函数
解释:
全局静态函数 - 全局函数和静态函数不属于任何类的实例,因此不能是虚函数。
普通成员函数 - 普通成员函数可以是虚函数,这是实现多态的基础。
静态成员函数 - 静态成员函数不与类的任何特定对象关联,因此它不能是虚函数。
构造函数 - 在C++中,构造函数不能被声明为虚函数。
3.下面哪个操作是安全的,不会导致内存操作越界
void func(char *p) {
char a[20] = {0};
strcpy(a, p);
}
这个函数使用 strcpy 来复制字符串,但没有检查 p 的长度。如果 p 的长度超过19个字符(包括空字符),这将导致数组 a 越界,是不安全的。
void func(char *p) {
int len = strlen(p) - 1;
char *a = (char*) malloc(len);
memcpy(a, p, len);
}
这个函数计算 strlen(p) - 1 作为长度,可能是为了去掉字符串末尾的空字符,但这样会导致最后一个字符丢失,同时分配的内存不包括终止的空字符,也是不安全的。
void func(char *p) {
int len = strlen(p);
char *a = (char*) malloc(len + 1);
memcpy(a, p, len);
a[len] = '\0';
}
这个函数正确地计算了长度,为字符串分配了足够的内存(包括空字符),并确保了字符串以空字符结束。这是一个安全的内存操作。
void func(char *p) {
char a[100] = {0};
sprintf(a, "%s%d", p, 1);
}
这个函数使用 sprintf 将字符串和一个整数格式化后存入数组 a。尽管数组大小为100,但如果 p 的长度非常大,仍有可能导致数组越界。
4.如下代码,打印输出的结果是
typedef struct
{
int a:8;
int b:8;
int c:8;
int d:8;
} field;
int main(void)
{
field t1;
memset(&t1,0,sizeof(t1));
t1.a = 257;
printf("%d %d\n", t1.a, t1.b);
return 0;
}
A 257 0
B 255 2
C
0 2
D
1 0
5.std::map<key,value>,当key值不是非基本类型时,需要实现哪个函数?
operator<()
operator<<()
operator>>()
operator>()
6.有关析构函数的说法不正确的是:
析构函数有且仅有一个
析构函数和构造函数一样可以有形参
析构函数的功能是用来释放一个对象
析构函数无任何函数类型
解释:析构函数不能有参数
7.以下错误的行是:
std::cout<<"测试\n";
operator<<(std::cout,"测试\n");
endl(std::cout);
std::cout<<endl;
解释:错误地将 endl 当作函数直接调用
8.下列关于函数模板的描述中,正确的是
函数模板的类型参数与函数的参数是同一个概念
使用函数模板定义的函数没有返回类型
函数模板的类型参数与函数的参数相同
一个类定义中,只要有一个函数模板,则这个类是类模板
解释:
1、函数模板的类型参数是用于指定函数参数和返回值的类型,而函数的参数是实际传递给函数的值。类型参数和函数参数是两个不同的概念。
2、函数模板可以有返回类型,而这个类型可以是固定的,如 int,double 等,或者由模板的类型参数决定。
4、一个类可以包含函数模板而本身不是类模板。类模板是指整个类的定义依赖于类型参数,而不是单独的函数。
9.
#include <iostream>
struct X
{
X() { std::cout << "1"; }
X(const X&) { std::cout << "3"; }
~X() { std::cout << "2"; }
void f() { std::cout << "4"; }
};
int main()
{
X object;
X copy = object;
object.f();
return 0;
}
11422
13422
12342
13242
10.
#include <iostream>
class A
{
public:
A()
{
std::cout << "A Construct\n";
func_init();
}
virtual ~A()
{
std::cout << "A Destruct\n";
func_deinit();
}
virtual void func_init()
{
std::cout << "this is A func_init\n";
}
virtual void func_deinit()
{
std::cout << "this is A func_deinit\n";
}
};
class B : public A
{
public:
B()
{
std::cout << "B Construct\n";
func_init();
}
~B() override
{
std::cout << "B Destruct\n";
func_deinit();
}
void func_init() override
{
std::cout << "this is B func_init\n";
}
void func_deinit() override
{
std::cout << "this is B func_deinit\n";
}
};
int main()
{
A* p = new B();
delete p;
return 0;
}
以上代码的输出是:
A Constuct this is B func_init B Construct this is B func_init B Destruct this is B func_deinit A Destruct this is B func_deinit
A Construct this is A func_init B Construct this is B func_init B Destruct this is B func_deinit A Destruct this is A func_deinit
A Construct this is B func_init B Construct this is B func_init A Destruct this is B func deinit B Destruct this is B func_deinit
B Construct this is A func_init A Construct this is B func init A Destruct this is B func deinit B Destruct this is A func_deinit
11.
template<typename T>
void print(T&& v)
{}
函数中,如果传入的是一个std::string &进来,那么v会被推导成:
string &&
string &
string
string *
解释:
std::string& (一个字符串的左值引用)
当一个左值引用传递给类型为 T&& 的参数时,根据模板推导规则和引用折叠规则,T 会被推导为 std::string&,而不是 std::string 或 std::string&&。引用折叠规则指出,左值引用到左值引用仍然是一个左值引用 (& && 折叠为 &)。
因此,v 的类型在这种情况下会被推导为 std::string &。
12. test.cpp内容如下
#include <iostream>
using namespace std;
int show(char* p) {
return sizeof(p);
}
int main() {
char p[2];
cout << sizeof(p) << " " << show(p) << endl;
return 0;
}
用g++ -m32 test.cpp编译执行结果是?
22
24
44
28
13.下面代码运行输出是
#include <stdio.h>
int main()
{
int a[6] = {1, 2, 3, 4, 5, 6};
int *p = (int*)(&a + 1);
printf("%d, %d\n", *(a + 1), *(p - 2));
return 0;
}
2,4
2,5
2,6
3,4
14.以下叙述中正确的是():
函数的定义不可以嵌套,但函数的调用可以嵌套
main函数必须放在其他函数之前
所有被调用的函数定要在调用之前进行定义
在C语言程序中有调用关系的所有函数必须放在同一个源文件中
解释:
2、main 函数的位置在源文件中不是固定的。它不需要放在其他函数定义之前。编译器会在整个源文件或项目中寻找 ma
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏主要发布嵌入式软件开发相关岗位2023年(2024届)的笔试真题(嵌入式软件开发、通用软件开发、C/C++软件开发、算法工程师、数据开发、测试开发等)主要是算法编程题,其中一些岗位笔试含有对应的选择题、填空题、简单题。

