C语言|集1

在GATE CS考试中提出了以下问题。

null

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)

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享