LinuxSir.cn,穿越时空的Linuxsir!

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

一个数据保存和溢出的问题,(请过目)

[复制链接]
发表于 2003-4-20 13:20:34 | 显示全部楼层 |阅读模式
兄弟在试验溢出区的时候遇到了令我迷惑的事情,希望高手解惑,
(源代码,tc 3.0编译):
#include "stdio.h"
#include "string.h"
void main()
{
   /*定义两个字符数组a[10],b[5],有问题*/

   printf("input a[10]");
   scanf("%s",a);
   
   strcpy(b,a);//将a考入b中
   printf("a is %s",a);
   printf("b is %s",b);
}

问题:
1:定义 char a[10],b[5]; 注意 a[10]在前.
        输入12345          a=12345  b=12345.
        输入12345678       a=78     b=12345678
        输入123456789012345 a=789012345 b=123456789012345
  如果定义 static char a[10],b[5]; 注意 a[10]在前,加入static.   
        输入12345          a=12345  b=12345.
        输入12345678       a=12345678     b=12345678
        输入1234567890     a=123456789012345678901 a[10]                                          b=12345678901 a[10] 注意空格和'a[10]'都是输                                                     出的
2:定义 char b[5],a[10];  注意 b[5]在前.
        输入12345          a=12345  b=12345.
        输入12345678       a=12345678     b=12345678 但屏幕下又输出                                     (abnormal program terminaturn)
        输入1234567890     a=123456789012345678901(还有一个A上有两个点                                                 的字符)
                           b=12345678901(还有一个A上有两个点的字符)
  如果定义 static char b[5],a[10]; 注意 b[5]在前,加入static.
         输入12345          a=空  b=12345.
         输入12345678       a=678     b=12345678
         输入1234567890     a=67890     b=1234567890
         输入123456789012345 a=6789012345 b=123456789012345
我在迷茫中
 楼主| 发表于 2003-4-20 17:47:26 | 显示全部楼层
:eek:
为什么没人回话,是不是我问的太简单了?
发表于 2003-4-21 19:39:11 | 显示全部楼层
看看a和b的地址,你就能解释了
发表于 2003-4-22 01:46:03 | 显示全部楼层
局部变量是从堆栈里面分配的。如果你会用 debugger 的话,好像 app 说的,检查一下 a 还有 b 的地址就会明白为什么了。

比如说你的问题一里面的第二种情况

1:定义 char a[10],b[5]; 注意 a[10]在前.
输入12345678 a=78 b=12345678

  1. 1 2 3 4 5 6 7 8 \0
  2. ^           ^
  3. |           +----- a 从这里开始。
  4. +---------b 从这里开始。
复制代码

这下明白了吧?
 楼主| 发表于 2003-4-23 16:18:21 | 显示全部楼层
兄弟!
你说的地址什么的我都知道,一个例子我也可以解释,可是,谁可以整体讲一讲.比如.static 加不加的后果
发表于 2003-4-23 23:55:12 | 显示全部楼层
你的问题中就是说你在迷茫,也不说你到底迷茫在什么地方啊??
你既然明白了我给你的例子,按理说就不应该迷茫了呀!

加上了 static, 那个变量就不再从堆栈里面分配了。不再对战中,在写出界以后,危害可能不是马上出来。如果你把堆栈写坏了,程序就乱跳了。
发表于 2003-4-24 20:26:07 | 显示全部楼层
没什么呀,看了你写的输出感觉正确。
 楼主| 发表于 2003-4-25 08:42:30 | 显示全部楼层
原来如此,static后不是堆栈里的东西了,我懂了,谢谢!
发表于 2003-4-25 10:43:34 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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