📜  C语言 |设置 1

📅  最后修改于: 2021-09-27 06:22:51             🧑  作者: Mango

以下问题已在 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) 一个数组,它的每个元素都是一个节点类型的结构。

答案:(一)