CXD Linux Engineer

某公司C语言笔试题


选择题

  • int a,b;
    void swap(&a,&b)交换a,b的值,请选择swap的正确实现()
    答案:A
      Avoid swap(int *p1,int *p2)
      {
          int p;
          p=*p1;
          *p1=*p2;
          *p2=p;
      }
    
      Bvoid swap(int *p1,int *p2)
      {
          /* 指针p没有初始化,所以直接给*p赋值会导致内存错误 
          * 在GCC编译器中运行时出现段错误,在VS2015中编译不通过
          */
          int *p; 
          *p=*p1;
          *p1=*p2;
          *p2=*p;
      }
    
      Cvoid swap(int *p1,int *p2)
      {
          /* 只交换了指针变量p1、p2所指向的值,没有实际更改a、b的值 */
          int *p;
          p=p1;
          p1=p2;
          p2=p;
      }
    
  • int a[][3] = { {20,19,18},{33,34,35},{66,37,38},{1,2,3} };   
    int *p = a[1] + 5; // *p 的值等于 38
    int *y = (int *)(&a[1] + 1); // *y 的值等于 66 ,(&a[1] + 1)的长度是增加了 3*sizeof(int) 个长度 
     // 此时(&a[1] + 1)的指针类型是 int (*a)[3] ,一个指向长度为3的int型数组的指针
    

补充:

int b[10] = { 20,19,18,4,5,6,7,8,9,10};  
int *p = b + 2; // *p 的值等于 18    
int *q = (int *)(&b + 1); // *(q-1) 的值等于 10 ,(&b + 1)的长度增加了 10*sizeof(int) 个长度 

struct test{
	int a;
	int b;
	int c;
};

int main()
{
    struct test *ss;
    ss = (struct test *)malloc(sizeof(struct test));
    ss->a = 10;
    ss->b = 11;
    ss->c = 12;
	
    int *xx = (int *)(ss + 1); //(ss + 1)的长度增加了 sizeof(struct test)个长度
    printf("xx = %d\n",*(xx-1)); // xx的值等于 12
}

int main()
{
    struct test ss;
    ss.a = 10;
    ss.b = 11;
    ss.c = 12;

    int *xx = (int *)(&ss + 1); // (ss + 1)的长度增加了 sizeof(struct test)个长度
    printf("xx = %d\n",*(xx - 1)); // xx的值等于 12
}

  • 以下程序运行结果是gae
    int main()
    {
      char a[] = "Language";
      char b[] = "Programe";
      char *p1, *p2;
      int k;
    
      p1 = a;
      p2 = b;
      /* 判断字符相等则输出 */
      for (k = 0; k <= 7; k++) {
          if (*(p1 + k) == *(p2 + k))
              printf("%c", *(p1 + k));
      }
      return 0;
    }
    
  • 如下函数,输出结果是4
    void example(char acHello[])
    {
      printf("%d\n", sizeof(acHello));
      /* 数组在函数参数中传递后退化为指针 */
      return;
    }
    int main()
    {
      char acHello[] = "hello";
      example(acHello);
      return 0;
    }
    
  • 0x12345678在采用大端模式时内存的排列顺序是12 34 56 78
    在采用小端模式时内存的排列顺序是78 56 34 12

  • 定义int array[10], *m = array, *n = &array[4];那么 n - m 的值是4
    解释:两个指针相减,减的是指针之间的间隔多少个单位长度,而不是地址值直接相减。

  • unsigned char aucArray[2][3] = { {1,2},{3,4} }; 在内存中的布局是1 2 0 3 4 0
    unsigned char aucArray[2][3] = { 1,2,3,4 }; 在内存中的布局是1 2 3 4 0 0

  • 32位系统,struct BBB的定义如下,则sizeof(struct BBB) = 28
    struct AAA
    {
      char a[5];   //8
      int b;       //4
      short int c; //4
    };
    struct BBB
    {
      char *d;         //4
      short int e;     //4
      struct AAA f;    //16
      char g;          //4
    };
    /* 当BBB是下面情况时sizeof(struct BBB) = `24` */
    struct BBB
    {
      char *d;         //4
      short int e;     //2
      char g;          //2
      struct AAA f;    //16
    };
    

简答题

  • 下面程序的打印结果: d = 19,b = -20
    解释:C语言的隐式类型转换规则如图:
    leixin
    所以这道题中的a+c会将a转化为无符号类型再进行计算,导致结果是一个非常大的值
    int main()
    {
      int a, b;
      unsigned int c, d;
      a = -20;
      c = 19.5;
      d = (a + c) ? c : a;
      b = (a + c > 0) ? a : c;
      printf("d = %d\n", d);
      printf("b = %d\n", b);
      return 0;
    }
    
  • 下列循环将执行多少次?无限次,因为a是无符号整型,所以总是大于等于0
    unsigned short a = 0x100;
    do{
      a--;
    }while(a >= 0);
    

上一篇 HTTP协议学习

Comments

Content