以下问题已在 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)
说明:在 P1 中,指针变量 x 是 g() 的局部变量,g() 返回指向该变量的指针。 x 可能在 g() 返回后消失,因为 x 存在于堆栈中。因此, &x 可能会无效。
在 P2 中,指针变量 px 被赋值而不分配内存。
P3 工作得很好。使用 malloc() 将内存分配给指针变量 px。因此,px 存在于堆上,即使在返回 g() 后,它的存在也会保留在内存中,因为它在堆上。
2. 下面的 C 程序执行结束时 j 的值。 (GATE 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);
}
(一) 10
(二) 4
(c) 6
(四) 7
答案(一)
说明: count 是 incr() 中的静态变量。语句 static int count = 0 只会在第一次调用时将 count 赋值为 0。对此函数的其他调用将采用计数的旧值。
调用 incr(0) 后 Count 将变为 0
调用 incr(1) 后 Count 将变为 1
调用 incr(2) 后 Count 将变为 3
调用 incr(3) 后 Count 将变为 6
调用 incr(4) 后 Count 将变为 10
3. 考虑下面的 C 声明
struct {
short s [5]
union {
float y;
long z;
}u;
} t;
假设short、float和long类型的对象分别占用2个字节、4个字节和8个字节。变量 t 的内存需求,忽略对齐
考虑因素,是(GATE CS 2000)
(a) 22 字节
(b) 14 个字节
(c) 18 个字节
(d) 10 个字节
答案: (c)
说明:短数组 s[5] 将占用 10 个字节,因为 short 的大小为 2 个字节。由于 u 是联合,分配给 u 的内存最大为 float y(4 字节)和 long z(8 字节)。因此,总大小将为 18 字节 (10 + 8)。
4. 以下C 语句中的令牌数。
printf("i = %d, &i = %x", i, &i);
是(2000 年门)
(一) 3
(乙) 26
(c) 10
(四) 21
答案(c)
说明:在 C 源程序中,编译器识别的基本元素是“令牌”。标记是编译器不会分解为组件元素的源程序文本。
C 标记有 6 种类型:标识符、关键字、常量、运算符、字符串字面量和其他分隔符。上述 printf 语句中共有 10 个标记。
5.以下C声明
struct node
{
int i;
float j;
};
struct node *s[10] ;
将 s 定义为 (GATE CS 2000)
(a) 一个数组,它的每个元素都是一个指向节点类型结构的指针
(b) 2 个字段的结构,每个字段是一个指向 10 个元素的数组的指针
(c) 3 个字段的结构:整数、浮点数和 10 个元素的数组
(d) 一个数组,它的每个元素都是一个节点类型的结构。
答案:(一)