1、并且数组a在内存中的起始地址为0x10000,那么a5的地址是( ) q) 0x10005r) 0x10014s) 0x10016t) 0x100206. 在地址和整数都为32位宽的计算机里,编译器要为下面的代码片段分配多少字节的内存?int a;int * b = &a;u) 4v) 8w) 16x) 327. 在基于IA32的计算机硬件体系中,如果规定结构成员对齐为4Bytes,那么,对于结构体 struct S1 int i;char c;int j; 其在内存中分配的字节数为:y) 3 Byteszz) 5 Bytesaa) 9 Bytesbb) 12 Bytes8. 按照下列声明的顺
2、序,最后一行可以改写为:ptr = a + 5;*ptr+ = x;cc) a6 = x;dd) ptr = x; *ptr+;ee) ptr = ptr + 1; *ptr = x;ff) a5 = x; ptr = ptr + 1;9.对于char *pa10;的描述,( )是正确的gg) pa是一个指向数组的指针,所指向的数组是10个char 型元素hh) pa是一个指向某数组中第10个元素的指针,该指针是char型变量ii) pa5表示某个数组的第5个元素的值jj) pa是一个具有10个元素的指针数组,每一个元素是一个char 型指针10. 下面的程序会( )main() int x=
3、10,y=5,z=5; if(z=x-2*y) printf(“*”); else printf(“#”); kk) 有语法错误不能通过编译 ll) 可以通过编译,但不能通过连接,因而不能运行mm) 输出*nn) 输出#11. 考虑下面的代码: char a100; a99 = *(char *) (int) &a0) + 4) 如果整数为32位宽,下面哪个值等于a99?oo) a0 + 4pp) a3qq) a4rr) the integer stored in the bytes a4, a5, a6 and a712. 考虑一下代码片段: #include int callee(void
4、) int count = 5; printf(%d , (int) &count); return count;int main (int argc, char *argv) int count = 4; count = callee(); return 0; 下面哪项正确地描述了程序输出结果?ss) 两个不同的整数被打印,并且从所给信息无法得知其中的任何一个值tt) 同一个整数被打印两次,并且它的值无法从所给信息中得知uu) 5在同一行被打印两次vv) 5和4按顺序在同一行被打印13. 阅读下列代码,判断下面几句话中哪句关于输出的描述是正确的?( )int * jp = &i;int ma
5、in(int i, char * argv) %d %dni, (int) jp);ww) 两个不同的整型数xx) 两个完全相同的整型数yy) 无结果,因为代码含糊无法编译zzz) 两个值,其中一个是4,另一个比4小14.考虑下面的代码片断:int factorial(int * arg) int n = *arg; if (n = 1) return n; return n * factorial(n - 1);在上面的代码片段执行过程中,变量n被分配到 ( )aaa) 许多地址,并且编译器不知道其中的任何一个地址bbb) 编译器选定的许多地址ccc) 仅一个地址,并且该地址由编译器选定dd
6、d) 仅一个地址,并且编译器不知道该地址15 以下程序的输出结果是 ( ) func1(int a, int b) return (a+b); func2(int a, int b) return (a-b); func3(int (*t)(), int x, int y) return (*t)(x,y); main() int x, (*p)(int,int); p=func1; x=func3(p,9,3); x+=func3(func2,8,3); printf(“%dn”,x);eee) 3fff) 9ggg) 17hhh) 27 16.下面哪一个负责数据从CPU寄存器到缓存的传输?
7、iii) 硬件jjj) 操作系统kkk) 寄存器lll) 编译器 17.假设你的计算机是32位,具有128个32字节的直接映射缓存线。在下面的代码中,编译器在地址0x800000处分配数组a,在地址0x801000处分配数组b。在该代码执行前,假设a和b从未被使用,因此它们不会在缓存中。请问,在执行这段代码时,a和b数组能够从内存读入缓存的最小字节分别是多少?int b1024;int a1024;for (i = 0; i 17; sum += ai + bi, i+);mmm) 17nnn) 68ooo) 96ppp) 1088 18.通过调用以下的函数,关于缓存的哪些事实能够判定?int
8、 data1 20;void callee(int x) int i, result; for (i = 0; (1 20); i += x) result += datai;I. 缓存线大小II. 缓存大小III. 缓存速度qqq) 只有Irrr) I和IIsss) I和IIIttt) I、II和III19 下面哪个对存储层次结构(memory hierarchy)的描述正确? ( )uuu) 存储层次结构使得代码执行变慢,但是允许它们规模增加vvv) 存储层次结构既利用了SRAM的速度,又考虑了磁盘的空间www) 存储层次结构是一种决定内存分配策略的方法xxx) 存储层次结构限制了程序的大
9、小,但是允许它们执行得更快 20 阅读下面C代码片段: char q=do not overflow char r= memory char s24; strcpy(s,q); strcat(s,r); int len=strlen(s);问:当该代码片段执行完毕时,变量len的值是( ) yyy) 21zzzz) 22aaaa) 23bbbb) 24 二、 改错题。请指出下面代码的错误之处,给出正确代码,并说明错误的原因。(1-6题每题2分,7-10题每题3分,共24分)示例: y = x*300.0f -2000.0 (缺少结束符“;”) 正确代码:y = x*300.0f -2000.0
10、;1、 程序员意图:由用户输入变量i和d的值,然后由系统输出。(2分)double d;scanf(%d %g, i, d);printf(2、 程序员意图:数组动态分配,并给某一数组成员赋值。#define ARRAY_SIZE 100int *a = (int *) malloc(ARRAY_SIZE);a99 = 0;3、 程序员意图:如果指针a指向的值大于0,则使该值减去1。void dec_positive(int *a) *a-; / decrement the integer if (*a 0) *a = 0; / make sure a is positive4、 程序员意图:
11、动态分配一个Amn的数组,并充分考虑代码在不同硬件上的通用性。int *makeArray1(int n, int m) int i; int *A = (int *)Malloc(n * sizeof (int); for (i=0; iname = (char *) malloc(M);address = (char *) malloc(N); free(p);9、 程序员意图:搜索一个符合条件的指针。int *search(int *p, int val) while (*p & *p != val) p += sizeof(int); return p;10、 程序员意图:将array
12、数组初始化为从0到9的10个数。#define ARRAY_SIZE 10void natural_numbers (void) int arrayARRAY_SIZE; i = 1; while (i = ARRAY_SIZE) arrayi = i - 1; i = i + 1;三、 简答与计算题(36分)1. 解释静态分配与动态分配的概念及它们的不同点,并说明它们的用途。(6分)静态分配在全局中声明变量,或在函数体中用static,在声明时若没被赋初值则赋为0,放置于栈的最低层中,生命周期是整个程序的生命周期。在编译阶段决定。动态分配通过在函数调用中声明局部变量实现,生命周期是此函数的生
13、命周期,动态分配有堆分配与栈分配2种方式。2. 简述使用堆栈进行函数调用的过程。第一步:压参,由右至左入栈第二步:压入函数返回地址。第三步:压入Frame Pointer。第四步:压入声明的变量第五步:执行函数的代码第六步:将返回值压入寄存器中。第七步:将SP设定至为Frame Pointer第八步:弹出栈顶元素(Frame Pointer)第九步:弹出栈顶元素(Return Address)并返回函数简要解释80/20原理和Amdahl定律。说明对代码进行性能定量量测可以采用哪些方法,这些方法各自具有哪些优点,又具有哪些缺点。直意为80%时间是由20%的代码耗费的,也就是每个程序都存在性能提
14、升的瓶颈,只要克服了这个瓶颈,性能就会大大提升。Amdahl定律为(公式),揭示了被优化的代码在被优化后与优化前的时间对比。3. 请画出计算机中内存层次结构的金字塔结构,并说明内存缓存(cache)的优点。4. 3M决定在白纸上印黄方格,做成小贴纸。这个过程中,他们需要设置方格中每个点的CMYK(蓝色,红色,黄色,黑色)值。3M雇佣你判定下面算法在一个2048字节、直接映射、块大小为32字节的数据高速缓存上的有效性。有如下定义:struct point_color int c; int m; int y; int k;struct point_color square1616;int i, j;有如下假设: sizeof(int) = 4; square起始于存储器地址0; 高速缓存起始为空; 惟一的存储器是对于square数组中的元素。变量i和j被存放在寄存器中。a. 确定下列代码的高速缓存性能: 16; i+) for (j = 0; j j+) squareij.y = 1; squareij.c = 0; squareij.m = 0; squareij.k = 0;写总数是多少?在高速缓存中命中的写总数是多少?命中率是多少?b. 要提高a小题中代码的缓存命中率,可以采取什么方法?(即怎样改写代码?)写出改写后的代码,并计算出你改写后的代码的命中率,以证明代码确实已改良。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1