推荐几道C语言笔试题,测试你的C语言功底

来源:互联网 发布:java streamsource 编辑:程序博客网 时间:2024/04/30 05:10

 

1、如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?

(环境是vc6Debug方式下)

#include<stdio.h>

void test()

{

  int t;

  scanf("%d",&t);

  //在这里加入代码

}

void main()

{

  int m;

  test();

  printf("m=%d",m);

}

 

答案:

//在这里加入代码

*(&t + 22) = t;

debug该程序,记录变量m的地址和变量t的地址,两者相减得88byte)。于是取t的地址加22(指针为int*型),得到m的地址。然后通过该指针将m的值设成t的值。注意两变量地址的差值与编译器分配栈空间的方式有关,只能通过debug看出来。如果改成release模式,该值会有变化。另外内嵌汇编也是可以做到,原理一样。

 

2、请运行下面的代码,观察结果,有人说怎么是死循环,你同意吗?为什么?

 

#include <stdio.h>

int main()

{

  int i = 0;

  int name[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

 

  for (i = 0; i <= 10; i++)

  {

    name[i] = 0;

    printf("ok/n");

  }

  return 0;

}

 

答案:

看到该题第一反应是i<=10写错了,应该是i<10。那么为什么写成i<=10就会死循环呢?

由于编译器先分配变量i的空间,然后紧接着分配数组name[10]的空间,两者栈空间是紧邻的。因此name[0]~name[9]name的空间,name[10]的地址其实就是i的地址,只不过它们名字不同罢了(memory alias)。循环至i=10时,name[i] = 0这条语句其实是将i值改为了0。此时i0,循环结束时判断i<=10显然条件满足,于是循环又回到i=0继续执行。如

此往复便成了死循环。

 

3、实现多参函数

大家对C语言中最熟悉的函数就是“printf”吧?这是在HelloWorld例子里就见过了。那么你真正了解它吗?请设计一个类似于printf的函数的多参函数int Add();这个函数的功能:

例如Add(4, 5, 0); 返回9

Add(4, 5, 6, 0);返回15…………可以输入大于0个参数(参数类型为整型)

 

答案:

#include <stdarg.h>

 

int Add(int a, ...)

{

       int sum = a;

       int temp;

       va_list arg_ptr;

 

       va_start(arg_ptr, a);

       while(temp = va_arg(arg_ptr, int))

       {

              sum += temp;

       }

       va_end(arg_ptr);

       return sum;

}

需要注意的是,在调用实际参数可变的函数时,必须由调用者显式指定实际参数的个数,比如这里的Add就是指定最后一个参数为0来指定实际参数的结束,而printf是通过第一个参数中输出格式的定义来确定实际参数的个数。否则可变参数的函数将无法实现。大家可以试试看,如果传入的最后一个实参不是0,结果会是怎样?