HNU计算机系统期中题库详解(四)C语言与程序运行(数据类型、指针、内存、编译链接)
数据类型与类型转换ID: 9571题目对于某台计算机以下说法正确的是A int 型值与 short 型值长度总是不一样B int 型值与 float 型值长度总是一样C 指向 int 型的指针与指向 char 型的指针长度总是一样D double 型值与 float 型值总是不一样解析Aint和short的长度在不同平台可能相同如部分16位系统“总是不一样”错误。Bint可能是4字节float也可能是4字节但也存在不同平台差异“总是一样”错误。C同一平台下所有指针的长度都相同等于机器字长如32位或64位与指向的类型无关正确。Ddouble和float类型不同但“值总是不一样”说法错误如float 1.0和double 1.0值相同。答案C知识点总结同一平台下指针的长度由机器字长决定与指向的数据类型无关。ID: 9496题目关于 32 位机器下int,float,double格式强制转换错误的是A int 转到 float,数字不会溢出但不会被舍入。B double 转 float可能溢出成为正无穷或负无穷。C double 转 float可能会被舍入。D double 转 int值将会向 0 舍入。解析Aint转float时虽然不会溢出float指数范围更大但部分大整数无法被float精确表示会被舍入“不会被舍入”错误。Bdouble转float时若数值超出float范围会变为无穷大正确。Cdouble转float时精度损失会导致舍入正确。Ddouble转int时向零截断即向0舍入正确。答案A知识点总结int转float时超出float尾数精度的整数会被舍入double转float可能溢出或舍入double转int向零舍入。ID: 9502题目下列说法正确的是A 在 C 语言中一个有符号数和一个无符号数相加得到的结果一定是一个无符号数B 在 C 语言中一个有符号数和一个无符号数相加得到的结果可能是一个有符号数C 在 C 语言中一个有符号数和一个无符号数相减得到的结果一定是一个有符号数D 在 C 语言中一个有符号数和一个无符号数相减得到的结果可能是一个有符号数解析在C语言中有符号数与无符号数运算时有符号数会被隐式转换为无符号数结果为无符号数。因此A正确B、C、D错误。答案A知识点总结C语言中有符号数与无符号数运算时有符号数会被隐式提升为无符号数结果为无符号数。ID: 9712题目有符号数与无符号数运算的结果为A 有符号数B 无符号数C 0D 不确定解析根据C语言的类型提升规则有符号数与无符号数运算时有符号数会被隐式转换为无符号数结果为无符号数。答案B知识点总结C语言中有符号数与无符号数运算的结果为无符号数。ID: 9482题目当执行一个运算时如果它的一个运算数是有符号的而另一个是无符号的那么 C 语言会( )将( )参数强制类型转换为( )数并假设这两个数都是非负的来执行这个运算。A 显式地 无符号 有符号B 显示地 有符号 无符号C 隐式地 无符号 有符号D 隐式地 有符号 无符号解析C语言会隐式地将有符号数转换为无符号数再执行运算。因此选D。答案D知识点总结C语言中有符号数与无符号数运算时会隐式地将有符号数转换为无符号数。ID: 9472题目32 位 linux 系统中long 类型的字节数是A 2B 4C 6D 8解析32位Linux系统中long类型的长度为4字节64位Linux中为8字节。答案B知识点总结32位系统中long类型占4字节64位系统中占8字节。ID: 9726题目下面 C 语言语句中数据类型及其典型的取值范围搭配正确的是()A char [-128,127]B unsigned char [0,128]C short [-32768,32768]D unsigned short [0,32767]解析Achar通常为有符号8位范围[-128, 127]正确。Bunsigned char范围应为[0, 255]错误。Cshort为16位有符号范围[-32768, 32767]选项中最大值错误。Dunsigned short范围应为[0, 65535]错误。答案A知识点总结char有符号[-128, 127]unsigned char[0, 255]short[-32768, 32767]unsigned short[0, 65535]指针、数组、结构体、联合体ID: 9433题目double *D[5]的元素大小和总大小分别为A 8 40B 8 5C 4 20D 4 5解析double *D[5]是指针数组每个元素是指向double的指针。指针的大小由平台决定64位平台下为8字节32位平台下为4字节。题目选项A8 40对应64位平台元素大小8字节总大小5×840字节为常规考点。答案A知识点总结指针数组的元素是指针其大小等于平台指针宽度总大小元素个数×单个指针大小。ID:9552题目32位机器中联合体定义Union a{ int p[3]; Union a *next; double b; };求联合体占用字节数A 40B 24C 12D 8选项解析32位环境int p[3](3\times 4 12) 字节Union a *next指针 4 字节double b8 字节共用体联合体整体大小 最长成员的字节数无需额外整体对齐填充。最长成员为int p[3]占用 12 字节。答案C知识点总结联合体所有成员共享同一块内存存储空间取决于字节数最大的成员。ID: 9553题目64位机器中声明int *p[8]占用的存储空间是多少字节A 32B 64C 8D 40解析int *p[8]是指针数组每个元素是int*指针64位平台下指针大小为8字节。总大小8×864字节。答案B知识点总结64位平台下指针大小为8字节指针数组总大小元素个数×8。ID: 9554题目32位机器中声明char (*p)[8]占用的存储空间是多少字节A 32B 16C 8D 4解析char (*p)[8]是指向长度为8的char数组的指针。指针的大小由平台决定32位平台下指针大小为4字节。答案D知识点总结32位平台下指针大小为4字节无论指向何种类型指针本身大小固定。ID: 9480题目关于指针的说法错误的是A 每个指针都有一个值B 运算符*用于指针的间接引用C 将指针从一种类型强制转换成另一种类型它的类型和值都会改变D 数组与指针紧密联系解析A指针存储内存地址必然有一个值正确。B*p用于访问指针指向的内容即间接引用正确。C指针强制转换仅改变其类型解释不改变存储的地址值错误。D数组名可隐式转换为指向首元素的指针二者联系紧密正确。答案C知识点总结指针强制转换仅改变类型解释不改变其存储的地址值。ID: 9643题目声明数组int A[5][3]起始地址为XA则A[3][1]的地址为AXA12BXA16CXA40DXA52解析二维数组按行优先存储int占4字节。A[3][1]前面有3行完整的行A[0]~A[2]每行3个元素加上A[3]中的1个元素总偏移量(3×3 1) × 4 10×440字节。地址为XA 40。答案C知识点总结二维数组行优先存储元素地址基地址 (行号×列数 列号)×元素大小。ID: 9646题目定义int x, *pb;正确的赋值表达式是Apb xBpb xC*pb xD*pb *x解析Ax是变量x的地址赋值给指针pb正确。B将int变量赋值给指针类型不匹配错误。C*pb是指针指向的内容需赋值int值而非地址错误。Dx不是指针不能用*x间接引用错误。答案A知识点总结指针存储地址赋值时需用取变量地址。ID: 9717题目声明语句int *f();中标识符f代表的是A 指向整型数据的指针变量B 指向一维数组的行指针C 指向函数的指针变量D 返回值为指针型的函数名解析int *f();是函数声明f是函数名该函数返回值为int*整型指针。答案D知识点总结类型 *函数名();表示返回值为对应类型指针的函数声明。ID: 9586题目关于结构体存储对齐规则说法错误的是A 结构的首地址必须是最小元素字节数的整数倍B 结构中每个数据的地址必须是其字节数的整数倍C 结构的总体长度必须是最大元素字节数的整数倍D 结构体中元素按照定义顺序放入内存解析A结构体首地址需对齐到最大成员的对齐单位而非最小元素错误。B每个成员的地址需是自身大小的整数倍正确。C结构体总长度需对齐到最大成员的大小正确。D结构体成员按定义顺序存储中间可能填充对齐字节正确。答案A知识点总结结构体对齐规则首地址按最大成员对齐、成员按自身大小对齐、总长度按最大成员大小对齐。ID: 9667题目32位Linux系统下struct{ char c; int a; }所占字节数为A 5B 8C 10D 不确定解析char c占1字节为满足int a4字节的对齐要求c后填充3字节a占4字节。总长度1348字节。答案B知识点总结结构体成员间需按自身大小对齐不足时填充字节。ID: 9668题目32位Linux系统下struct{ char *cp; int a; }所占字节数为A 4B 8C 12D 16解析char *cp是指针32位下占4字节int a占4字节。二者大小均为4字节无需额外填充总长度448字节。答案B知识点总结结构体成员大小相同时无需额外对齐填充。ID: 9690题目定义数组short A[7]short占2字节起始地址为Xa则A[2]的地址为AXa2BXa4CXa6DXa8解析A[2]是数组第3个元素索引从0开始偏移量为2×24字节。地址为Xa 4。答案B知识点总结一维数组元素地址基地址 索引×元素大小。ID: 9691题目比较struct foo1和struct foo2哪个更节省内存Afoo1Bfoo2C 没有区别D 依计算机不同而不同解析结构体的填充字节取决于成员顺序按成员大小从大到小排列可减少对齐填充。foo2中double、long等大成员在前小成员在后减少了对齐填充更节省内存。答案B知识点总结结构体成员按大小从大到小排列可减少对齐填充节省内存。ID: 9462题目char *p指针p占多少个字节A 1B 2C 3D 4解析指针的大小由系统的寻址能力决定题目选项默认是32位系统。32位系统中所有指针的大小均为4字节与指向的类型char/int/double等无关。答案D知识点总结指针的大小等于系统的地址总线宽度32位为4字节64位为8字节与指向的数据类型无关。ID: 9575题目对于32位机器char*的字节数为A 1B 2C 4D 8解析32位机器的地址总线宽度为32位因此所有指针类型的大小均为4字节。char*是指向字符的指针本身的大小仍由系统决定为4字节。答案C知识点总结32位系统下所有指针类型包括char*、int*、void*等的大小均为4字节。ID: 9459题目C语言中声明int i,j时i和j在内存中分配的地址肯定相邻这种说法A 正确B 错误解析C语言标准未规定局部变量在栈中的存储顺序编译器可能根据优化、对齐要求调整变量位置。例如编译器可能在i和j之间插入填充字节或改变分配顺序导致地址不相邻。答案B知识点总结C语言中同一声明语句的局部变量地址不一定相邻取决于编译器的实现与优化策略。ID: 9485题目show_bytes函数调用输出结果const char *sabcdef; show_bytes((byte_pointer)s, strlen(s));Aa b c d e fB66 65 64 63 62 61C61 62 63 64 65 66Df e d c b a解析show_bytes按字节依次输出字符串的ASCII码。abcdef的ASCII码依次为a(0x61)、b(0x62)、c(0x63)、d(0x64)、e(0x65)、f(0x66)。字符串按字节顺序存储输出顺序与字符串顺序一致。答案C知识点总结字符串在内存中按顺序存储show_bytes按字节依次输出不受大小端影响字符为单字节。ID: 9602题目C语言中定义int x, *p;正确的赋值表达式是A*p *xB*p xC*p *xDp x解析Ax取变量x的地址*x等价于x取地址后解引用即变量本身将x的值赋值给*p指针指向的内容正确。Bx是地址*p是int类型类型不匹配错误。Cx不是指针不能用*x解引用错误。Dx是int类型p是指针类型不匹配错误。答案A知识点总结取变量地址*解引用指针*x等价于变量x本身。ID: 9650题目int len strlen(s);如果shell则lenA 4B 5Cs的首地址D 0解析strlen函数计算字符串长度不包含末尾的\0结束符。hell包含4个字符h、e、l、l因此长度为4。答案A知识点总结strlen返回字符串中有效字符的个数不包含末尾的\0。ID: 9652题目字符串\ta\017bc的长度不包括结束符是A 9B 5C 6D 7解析逐个分析转义字符\t制表符1个字符a普通字符1个字符\017八进制转义字符1个字符b普通字符1个字符c普通字符1个字符总长度为5。答案B知识点总结C语言中转义字符如\t、\017均作为单个字符处理strlen统计其个数。编译、汇编、链接、调试ID: 9432题目C语言程序编译运行过程中不能用文本编辑器直接打开查看的二进制文件是Ahello.sBhello.iChello.cDhello.o解析Ahello.s是汇编文件文本格式可直接查看。Bhello.i是预处理后的源文件文本格式可直接查看。Chello.c是C源文件文本格式可直接查看。Dhello.o是目标文件机器码重定位信息二进制格式无法直接用文本编辑器查看。答案D知识点总结C程序编译生成的中间文件中目标文件.o和可执行文件为二进制文件其余.c/.i/.s为文本文件。ID: 9434题目GCC编译时生成调试信息的附加参数是A-oB-gC-SD-E解析A-o用于指定输出文件名。B-g用于在可执行文件中嵌入调试信息供GDB等调试工具使用。C-S用于生成汇编文件.s。D-E用于仅执行预处理生成预处理后的文件.i。答案B知识点总结gcc -g参数用于在编译时生成调试信息是GDB调试的前提条件。ID: 9486题目C文件翻译为可执行文件的四个阶段排序正确的是A 预处理 → 编译 → 汇编 → 链接B 预处理 → 汇编 → 编译 → 链接C 预处理 → 汇编 → 链接 → 编译D 预处理 → 编译 → 链接 → 汇编解析C程序的完整编译流程预处理-E处理宏定义、头文件包含生成.i文件。编译-S将预处理后的文件翻译为汇编代码生成.s文件。汇编-c将汇编代码翻译为机器码生成目标文件.o。链接将多个目标文件和库文件链接为可执行文件。答案A知识点总结C程序编译流程预处理 → 编译 → 汇编 → 链接。ID: 9653题目汇编器as将hello.s翻译成A C程序B 文本文件C 机器语言指令D 可执行文件解析hello.s是汇编代码文件汇编器as的作用是将汇编指令翻译成机器语言指令生成目标文件hello.o。目标文件包含机器码但还未经过链接不是完整的可执行文件。答案C知识点总结汇编器将汇编代码翻译为机器语言指令生成目标文件.o。ID: 9677题目Linux中hello.c到hello.out的顺序为1预编译、2链接、3编译、4汇编A 1234B 1243C 1342D 1324解析对应编译流程预编译预处理→ 3. 编译 → 4. 汇编 → 2. 链接即顺序为1 → 3 → 4 → 2。答案C知识点总结C程序编译的完整顺序预处理预编译→ 编译 → 汇编 → 链接。ID: 9596题目GDB命令x/17xw sum中参数w表示A 单字节B 双字节C 四字节D 八字节解析GDB中x命令的单位参数b单字节1字节h双字节2字节w四字节4字节即wordg八字节8字节答案C知识点总结GDB的x命令中w表示以四字节为单位查看内存。ID: 9714题目关于编译器优化错误的说法是A 编译器优化依然需要程序员在高级语言编写时考虑性能问题B 编译器的优化有时会导致最终代码与源程序码大相径庭C 既然有不同优化应选择最高优化级别以获取最佳性能D 不同编译器的优化也会不同解析A正确编译器优化无法解决算法级别的低效程序员仍需考虑性能。B正确如循环展开、常量传播等优化会改变代码结构。C错误最高优化级别如-O3可能导致编译时间过长、调试信息丢失甚至引入兼容性问题并非所有场景都适用。D正确不同编译器如GCC、Clang的优化策略存在差异。答案C知识点总结编译器优化级别并非越高越好需根据场景选择如调试用-O0发布用-O2。ID: 9698题目插入printf()声明的阶段是A 预处理阶段B 编译阶段C 链接阶段D 汇编阶段解析printf()的声明在头文件stdio.h中预处理阶段会处理#include stdio.h将头文件内容包括printf的声明插入到源文件中。答案A知识点总结预处理阶段处理头文件包含、宏定义等会将头文件中的函数声明插入到源文件中。