1.嵌入式软件开发构建阶段的第一步、第二步和第三步分别是(A )
A.编译、链接、定址
B.链接、编译、定址
C.打包、定址、编译
D.编译、定址、链接
tips:
编译:在这一阶段,编译器分析源代码并生成中间或目标代码文件。编译器会进行语法检查、类型检查和优化。
链接:链接器将多个编译后的对象文件合并,并解决函数和变量的引用。这个步骤是确保程序的各个部分能够正确协同工作的关键。
定址:在链接完成后,定址过程会为程序的各个部分分配实际的内存地址,确保在嵌入式设备上正确加载和运行。
2.关于sizeof下面说法正确的是(C )
A.sizeof计算字符串的长度
B.sizeof计算字符串的长度包括’\0’结束标志
C.sizeof编译时计算分配内存空间大小
D.sizeof运行时计算动态分配内存空间大小
tips:
A. sizeof 计算字符串的长度:这不准确。sizeof 计算的是数据类型或变量在内存中占用的字节数,而不是字符串的字符数。
B. sizeof 计算字符串的长度包括 '\0' 结束标志:这也是不完全准确的。如果对一个字符串字面量使用 sizeof,它会计算整个数组的大小,包括 '\0',但 sizeof 本身并不用于计算字符串长度(通常用 strlen 来计算)。
C. sizeof 编译时计算分配内存空间大小:这是正确的。sizeof 在编译时计算类型或变量的大小,并返回所需的字节数。这是一个静态计算,与实际的运行时动态分配无关。
D. sizeof 运行时计算动态分配内存空间大小:这是错误的。sizeof 的值在编译时确定,不会计算运行时动态分配的内存空间的大小(如使用 malloc 分配的内存)。动态分配的内存大小需要通过其他方法来管理。
3.定义int *swap()指的是( B)
A.一个返回整型值的函数swap()
B.一个返回指向整型值指针的函数swap()
C.一个指向函数swap()的指针,函数返回一个整型值
D.以上说法均错
tips:
int *swap() 表示这是一个函数,函数名是 swap,返回值的类型是 int *,即指向整型的指针。
4.宏定义#define PI 31.14159中,宏名PI代替(D )
A.单精度
B.双精度
C.常量
D.字符串
tips:
宏定义的基本概念:#define 是一个预处理指令,用于定义一个宏。在这个例子中,PI 被定义为 3.14159。替换机制:在代码中出现 PI 的地方,预处理器会将其替换为 3.14159。这意味着在编译时,所有的 PI 会被视为 3.14159,而不是一个变量。数据类型:PI 本身并不代表单精度(float)或双精度(double)类型,它只是一个常量的名字。编译器会根据上下文(例如浮点运算)推断出所需的数据类型。
5.设有一个二维数组A[m][n],假设A[0][0]存放位置在 644,A[2][2]存放位置在676,每个元素占一个空间,问A[3][3]存放的位置在(C )。
A.688
B.678
C.692
D.696
tips:
Address( A[i][j] )=Base_Address+(i×n+j)×size
6.以下关于long、int和short类型数据占用内存大小的叙述正确的是(D )
A.均占4个字节
B.根据数据的大小来决定所占内存的字节数
C.由用户自己定义
D.由C语言编译系统决定
tips:
数据类型大小:
在 C 语言中,int、short 和 long 的大小是由编译器和系统架构决定的,并不是固定的。常见的情况下:
short 通常占 2 字节。
int 通常占 4 字节。
long 在32位系统上通常占 4 字节,在64位系统上通常占 8 字节。
选项分析:
A. 均占 4 个字节:
这是不正确的,因为 short 通常占 2 字节,而 long 的大小依赖于系统架构。
B. 根据数据的大小来决定所占内存的字节数:
这是不准确的。数据类型的大小是由编译器规定的,而不是由数据的实际值决定。
C. 由用户自己定义:
这也是不对的。虽然用户可以使用 typedef 定义新的数据类型,但基本类型的大小是由语言标准和编译器决定的。
D. 由 C 语言编译系统决定:
7.在C语言中,合法的长整型常数是(A )
A.0L
B.4962710
C.0412765
D.0xa34b7fe
tips:长整型常数:
在 C 语言中,长整型常数(long 类型)可以用后缀 L 或 l 来表示。
选项分析:
A. 0L:这是一个合法的长整型常数,0 是一个常数,后缀 L 表示它是长整型。
B. 4962710:这是一个合法的整型常数,但没有后缀 L,因此它默认是 int 类型。如果在需要 long 的上下文中使用,它会自动转换,但不算作长整型常数。
C. 0412765:这是一个合法的整型常数,但前缀 0 表示这是一个八进制数。在不带后缀的情况下,它仍然被视为 int 类型。
D. 0xa34b7fe:这是一个合法的十六进制整型常数,前缀 0x 表示十六进制,但同样没有后缀 L,所以它默认也是 int 类型。
8.下面的程序输出的结果是 随机值 。
#include <stdio.h>
int main (void)
{
int a =100;
int b[3]={200,300,400};
int c=500;
printf(“%d\n”, b[3]);
return 0;
}
数组访问越界,可能出现错误,也可能是随机值
9.有如下函数:
int Func( unsigned int x ){
int result = 0;
while(x)
{
result++;
x = x & (x-1);
}
}
当 x = 9999 时:
9999 的二进制表示是 10011100001111。
其中有 8 个 1。
因此,Func(9999) 的返回值是 8。
当 x = 1500161871 时:
1500161871 的二进制表示是 01011001011010101010011101001111 。
其中有 14 个 1。
因此,Func(1500161871) 的返回值是 14。
10.TCP/IP建立连接的过程?(三次握手)
TCP/IP建立连接的过程需要经过三次握手。下面是三次握手的详细步骤:
第一次握手(SYN):客户端发送一个带有SYN标志的数据包给服务器端,请求建立连接。这个数据包中会包含客户端选择的初始序列号(Sequence Number)。
第二次握手(SYN+ACK):服务器端收到客户端的SYN请求后,如果同意建立连接,则会发送一个带有SYN和ACK标志的数据包作为响应。该响应中会包含服务器端选择的初始序列号以及确认序号(Acknowledgment Number),确认序号为客户端的初始序列号加1。
第三次握手(ACK):客户端收到服务器端的响应后,会发送一个带有ACK标志的数据包给服务器端,确认收到了服务器端的响应。这个数据包中的确认序号为服务器端的初始序列号加1。
完成了这三次握手后,TCP连接就建立起来了,可以进行数据的传输。通过三次握手的过程,双方能够确认彼此的收发能力正常,并且同步初始化序列号,以便后续数据的可靠传输。如果在握手过程中出现任何一个阶段的超时或错误,连接建立将会失败,需要重新发起握手过程。
11.进程与线程的区别?
进程(Process)和线程(Thread)是操作系统中两个重要的概念,它们之间有着一些关键的区别:
资源分配:进程是操作系统中资源分配的基本单位,每个进程都有独立的内存空间、文件描述符、以及其他系统资源。而线程是在进程内部运行的实体,多个线程共享同一个进程的资源,包括内存空间、文件描述符等。
切换开销:由于进程拥有独立的地址空间,因此在进程切换时需要进行较大的上下文切换开销,涉及到页表切换等操作。而线程之间的切换开销相对较小,因为它们共享同一进程的地址空间,线程切换只需要保存和恢复寄存器的状态即可。
并发性:多个线程可以在同一进程内并发执行,彼此之间可以共享数据。而不同进程之间的数据共享相对困难,需要通过进程间通信(IPC)的方式来实现。
安全性:由于多个线程共享同一进程的地址空间,线程之间的数据共享需要谨慎处理,避免出现竞态条件和数据不一致的情况。而不同进程之间的数据相对更为独立,因此安全性方面会有一些优势。
总的来说,进程和线程都是实现并发执行的手段,但它们的应用场景和特点有所不同。通常情况下,线程用于实现轻量级的并发操作,而进程则用于实现更为独立和稳定的任务单元。
12.用C语言写一个模块化的函数,实现将一个字符串插入到另一个字符串中的指定位置。
/*
* @Author: [email protected]
* @Date: 2024-10-18 18:02:21
* @LastEditors: None
* @LastEditTime: None
* @FilePath: test.c
* @Description:
*
* Copyright (c) 2024 by [email protected], All Rights Reserved.
*/
#include <stdio.h>
#include <string.h>
void insertString(char *destination, const char *source, int position) {
int destLength = strlen(destination);
int sourceLength = strlen(source);
// 移动目标字符串中的字符,为插入字符串腾出空间
for (int i = destLength; i >= position; i--) {
destination[i + sourceLength] = destination[i];
}
// 插入源字符串到目标字符串的指定位置
for (int i = 0; i < sourceLength; i++) {
destination[position + i] = source[i];
}
}
int main() {
char str1[100] = "Hello, world!";
char str2[] = " beautiful";
int position = 7;
printf("Before insertion: %s\n", str1);
insertString(str1, str2, position);
printf("After insertion: %s\n", str1);
return 0;
}
13.请编写简单的C代码:
将一个16位数word a的高8位赋给byte b,低8位赋给byte c,再将b的高4位清
零,c的低4位置位后,重新以b为高位,c为低位的方式组合成16位数赋给word d。
/*
* @Author: [email protected]
* @Date: 2024-10-18 17:02:49
* @LastEditors: None
* @LastEditTime: None
* @FilePath: test.c
* @Description:
*
* Copyright (c) 2024 by [email protected], All Rights Reserved.
*/
#include <stdio.h>
#include <stdint.h>
int main() {
uint16_t a = 0xABCD;
uint8_t b, c;
uint16_t d;
// 将高8位赋给 b,低8位赋给 c
b = (a >> 8) & 0xFF;
c = a & 0xFF;
// 将 b 的高4位清零,c 的低4位设置为 1
b &= 0xF0;
c |= 0x0F;
// 将 b 和 c 组合成 16 位数赋给 d
d = ((uint16_t)b << 8) | c;
printf("a = 0x%04X\n", a);
printf("b = 0x%02X\n", b);
printf("c = 0x%02X\n", c);
printf("d = 0x%04X\n", d);
return 0;
}
标签:测试题,int,进程,线程,整型,字符串,sizeof
From: https://www.cnblogs.com/hhail08/p/18475116