(转)推荐几道C语言底层编程的题目,可以测试你的C语言功底

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个参数(参数类型为整型)。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勾玉2004

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值