在GATE CS考试中提出了以下问题。
1、考虑以下三个C函数:
[PI] int * g ( void ) { int x = 10; return (&x); } [P2] int * g ( void ) { int * px; *px = 10; return px; } [P3] int *g ( void ) { int *px; px = ( int *) malloc ( sizeof ( int )); *px = 10; return px; } |
以上三个函数中哪一个可能会导致指针出现问题?(2001号登机门) (a) 只有P3 (b) 只有P1和P3 (c) 只有P1和P2 (d) P1、P2和P3
答复: (c) ePlainion: 在P1中,指针变量x是g()的局部变量,g()返回指向该变量的指针。当x存在于堆栈上时,在g()返回后,x可能会消失。因此,&x可能会失效。 在P2中,指针变量px被分配一个值,而不给它分配内存。 P3工作得非常好。使用malloc()将内存分配给指针变量px。所以,px存在于堆上,即使在返回g()后,它的存在仍将保留在内存中,就像它在堆上一样。
2.执行以下C程序结束时的j值。(门CS 2000)
int incr ( int i) { static int count = 0; count = count + i; return (count); } main () { int i,j; for (i = 0; i <=4; i++) j = incr(i); } |
(a) 十 (b) 四, (c) 六, (d) 七,
答复 (a) ePlainion: count是incr()中的静态变量。语句static int count=0将仅在第一次调用中将count分配给0。对该函数的其他调用将采用旧的count值。 呼叫增加(0)后计数将变为0 呼叫增加后计数将变为1(1) 通话结束后计数将变为3(2) 通话结束后计数将变为6(3) 通话结束后计数将变为10(4)
3、考虑下面的C声明
struct { short s [5]; union { float y; long z; }u; } t; |
假设short、float和long类型的对象分别占用2字节、4字节和8字节。变量t的内存需求,忽略对齐 考虑事项,is(CS 2000号门) (a) 22字节 (b) 14字节 (c) 18字节 (d) 10字节
答复: (c) 说明: 短数组s[5]将占用10字节,因为短数组的大小为2字节。由于u是一个并集,分配给u的内存最大为浮点y(4字节)和长z(8字节)。因此,总大小将为18字节(10+8)。
4.以下C语句中的令牌数。
printf ( "i = %d, &i = %x" , i, &i); |
is(2000号门) (a) 三, (b) 26 (c) 十 (d) 21
答复 (c) 说明: 在C源程序中,编译器识别的基本元素是“令牌”标记是编译器不会分解为组件元素的源程序文本。 有6种类型的C标记:标识符、关键字、常量、运算符、字符串文字和其他分隔符。在上面的printf语句中总共有10个令牌。
5.以下C声明
struct node { int i; float j; }; struct node *s[10] ; |
定义待安装的门(门CS 2000)
(a) 一个数组,其每个元素都是指向node类型结构的指针 (b) 由两个字段组成的结构,每个字段都是指向10个元素数组的指针 (c) 由3个字段组成的结构:整数、浮点和10个元素的数组 (d) 一个数组,其每个元素都是node类型的结构。
答复: (a)