LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 806|回复: 7

请高手解释一下C中的static问题,多谢!

[复制链接]
发表于 2004-11-10 17:12:16 | 显示全部楼层 |阅读模式

  1. #include <stdio.h>
  2. exchange(int array[]) {
  3.         array[0] += array[1];
  4.         array[1] = array[0]-array[1];
  5.         array[0] -= array[1];
  6. }

  7. int main() {
  8.         int a=3,b=2;
  9.         exchange(&a);
  10.         printf("%d,%d\n",a,b);
  11. }
复制代码

这个程序编译运行结果不对,是2289832,2。
我把a和b定义成静态变量就没有问题

  1. #include <stdio.h>
  2. exchange(int array[]) {
  3.         array[0] += array[1];
  4.         array[1] = array[0]-array[1];
  5.         array[0] -= array[1];
  6. }

  7. int main() {
  8.         static int a=3,b=2;
  9.         exchange(&a);
  10.         printf("%d,%d\n",a,b);
  11. }
复制代码

这样运行就可以交换a和b的值
麻烦高手解释一下这个static[
发表于 2004-11-10 17:34:22 | 显示全部楼层
我看你的代码不出错,才有问题。
数组引用过界了。
 楼主| 发表于 2004-11-10 17:37:30 | 显示全部楼层
第一个应该是出错,第二个应该不会出错,结果正确,第一个程序是一个以前招聘的笔试题目,不让用指针实现两个变量值的交换,考的是数组当指针用,连续相同类型的变量可以看成一个数组,数组的起始地址为第一个变量的地址
发表于 2004-11-10 18:37:55 | 显示全部楼层
第一个程序:错误是明显的
因为,编译以后 a,b在堆栈段 a的地址高, b的地址底
所以,你用你的方法是引用不到b的数据的。(不过换一种方法就可一引用到了)
第二个程序a,b是在数据段,他们的安排是从底地址到高地址。这样就附和你的程序意思了,所以可以输出正确的答案。
 楼主| 发表于 2004-11-10 19:47:59 | 显示全部楼层
多谢nuclearweapon的解释!!!
发表于 2004-11-15 15:23:19 | 显示全部楼层
#include <stdio.h>
exchange(int array[]) {
array[0] += array[1];
array[1] = array[0]-array[1];
array[0] -= array[1];
}

int main() {
int a[2]={3,2};
exchange(a);
printf("%d,%d\n",a[0],a[1]);
}
发表于 2004-11-16 23:01:43 | 显示全部楼层
最初由 beyond93 发表
第一个应该是出错,第二个应该不会出错,结果正确,第一个程序是一个以前招聘的笔试题目,不让用指针实现两个变量值的交换,考的是数组当指针用,连续相同类型的变量可以看成一个数组,数组的起始地址为第一个变量的地址


不用指针,也不用其他临时变量, 就交换两个变量的值,
有这样一个思路, 你看看行不行, 当然如果要在function里实现的话,
下面的方法是不行的


  1. int a=1, b=5;

  2. a +=b;
  3. b = a-b;  
  4. a = a-b;
复制代码
发表于 2004-11-17 16:47:51 | 显示全部楼层
nuclearweapon
强人!又学到东西啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表