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的地址,两者相减得88(byte)。于是取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。此时i为0,循环结束时判断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,结果会是怎样?