嵌入式软件工程师C语言笔试精华问题解析

版权申诉
0 下载量 130 浏览量 更新于2024-08-03 收藏 122KB PDF 举报
嵌入式软件工程师C语言笔试题涵盖了C语言基础知识和嵌入式系统特定概念的测试。以下是部分题目详解: 1. **变量存储位置**: - 局部变量存在于**函数栈**中,它们在函数调用时创建,函数结束时自动释放。 - 全局变量存在于**数据段**或**静态区**,在整个程序运行期间存在。 - 动态申请的数据通常存在于**堆**中,通过`malloc`等内存管理函数分配。 2. **零值比较与指针大小**: - `inta`: 使用`if (a == 0)`检查整型变量`a`是否为零。 - 对于布尔类型`boola`,虽然没有直接的零值比较,但可以将其视为`true`或`false`的表示,通常不直接进行数值比较。 - 对于浮点型`floata`,同样不支持直接比较为零,可能需要使用`fabs`函数辅助。 - `void* a`:指针类型的大小取决于目标架构,不能直接做零值比较。 3. **内存计算**: - `sizeof(str)`返回字符串常量数组的字节数,由于`str[]`包含10个字符加上终止符,所以结果是10。 - `sizeof(p)`通常返回指针类型的大小,通常是4或8字节,取决于架构。 - `sizeof(n)`返回整型变量的字节数,即4字节。 - `sizeof(ptr)`同理,是`void*`指针的大小。 4. **指针算术**: - `p1 + 5`表示向`p1`的地址偏移5个字节,如果是`unsigned char`,结果将是0x87000005;如果是`unsigned long`,则需考虑到字节对齐,可能不会简单加5。 - `p2 + 5`类似,取决于`p2`指向的`unsigned long`类型占用多少字节。 5. **字符串操作**: - `strcpy(str, "0123456789")`将一个十进制数字字符串复制到`str`中,覆盖原有内容,结果是`str`存储了数字0-9。 6. **程序跳转**: - C语言中无直接指令实现绝对地址跳转,但可以通过函数调用间接实现,如`longjmp`或异常处理。 7. **数组长度计算**: - 使用预处理器宏定义`#define ARRAY_COUNT (sizeof(array) / sizeof(array[0]))`计算数组`array`的元素个数,前提是数组是连续的。 8. **预处理器条件编译**: - 这段代码用于防止多次包含同一头文件。`#ifndef`检查宏是否未定义,如果未定义则包含头文件。`#ifdef __cplusplus`确保在C++代码块中正确使用`extern "C"`,避免链接时的问题。 9. **结构体大小**: - `struct token_t`中的各个字段大小之和就是结构体的总大小,即`4 + 4 + 8 + 8 = 24`字节。 10. **强制类型转换**: - `short(*day_p)[16]`是二维数组指针,空白处应填写`day_p = (short(*)[16])malloc(sizeof(short[16]) * n);`,其中`n`是需要的行数。 11. **TCP/UDP区别及通信过程**: - TCP(Transmission Control Protocol)提供可靠连接,有流量控制、错误检测和重传机制;UDP(User Datagram Protocol)是无连接的,数据报文可能丢失或乱序,适合实时性要求高的应用。 - TCP/IP通信建立过程包括三次握手(SYN, SYN-ACK, ACK)来确认连接,而UDP仅需一次握手(SYN)就可发送数据。