大华嵌入式软件开发工程师笔试 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++软件开发、算法工程师、数据开发、测试开发等)主要是算法编程题,其中一些岗位笔试含有对应的选择题、填空题、简单题。

全部评论
发个答案呗
点赞 回复 分享
发布于 2023-10-27 20:49 福建

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
12 13 评论
分享
牛客网
牛客企业服务