Sign-up....

问个想不通的TC个人实验

main()

{

char a[2];

char *p;

int b=0;

gets(a);

p=a;

while(*p!='\0')

{

b++;

printf("%c\n",*p);

p++;

}

printf("%d",b);

getch();

}

小弟做个小实验

上面代码实现计算字符串长度

这段代码中 我故意将数组开辟为2个单位

发现如果开辟的数组长度为n时 当我输入n+3个字符时会出现“CPU遇到无效指令”问题 大于或小于n+3个字符都不会出现这种情况 另外 当输入n+2个字符时 会要求多输入一个字符 就象代码中数组长度为2 当我输入2+3即个数时 会出现“CPU遇到无效指令”问题 当输入2+2即4个字符时 会要求多输入一个字符 这个问题可能与系统相关吗?

PS:我的编译器:WIN-TC

[432 byte] By [msdn] at [2007-8-14 20:05:24]
# 1 Re: 问个想不通的TC个人实验

一切皆有可能

没有不可能

yevv at 2005-6-17 11:52:34 >
# 2 Re: 问个想不通的TC个人实验

有谁能帮解释一下吗?谢谢了!!!

majiaking4 at 2005-6-17 12:23:37 >
# 3 Re: 问个想不通的TC个人实验

估计a在申请内存的时候,是一块一块申请的,不是一个一个申请

lw1a2 at 2005-6-17 12:38:53 >
# 4 Re: 问个想不通的TC个人实验

不是一个一个申请的?char不就是一个一个的吗?

majiaking4 at 2005-6-17 12:45:51 >
# 5 Re: 问个想不通的TC个人实验

在C中你数组定义了多大,就给分配多少空间。

在语言中gets(char *a)函数不管a开始的空间多大,直到遇到'\n'时停止。

如果你读入的数据超过了a的大小,可能超过了数据段,把数据放到了代码段,

这样就可能出现无效的CPU指令,这也是一种网络攻击的方法。和缓冲区溢出攻击有点相似。

程序员遇到这种情况应该尽量避免,如果出现问题在找有时候很困难的。

caojunliang at 2005-6-17 13:42:04 >
# 6 Re: 问个想不通的TC个人实验

caojunliang(亮亮)大哥:

“如果你读入的数据超过了a的大小,可能超过了数据段,把数据放到了代码段,”

你能不能解释一下这两句话的意思呢 十分费解啊

谢谢你了!

majiaking4 at 2005-6-17 17:42:24 >
# 7 Re: 问个想不通的TC个人实验

建议你去看看计算机原理以及汇编语言,再理解caojunliang(亮亮)的话

zhang_db at 2005-6-17 21:12:45 >
# 8 Re: 问个想不通的TC个人实验

把程序汇编了看汇编码就清楚了。。这么短的:)

Wolf0403 at 2005-6-18 11:12:55 >
# 9 Re: 问个想不通的TC个人实验

我没学汇编 —……—

希望大家热心帮帮我

我没学过的不用解释太详细

打个比喻啊说的通俗点就可以了

十分感谢大家!

majiaking4 at 2005-6-18 16:16:08 >
# 10 Re: 问个想不通的TC个人实验

如果你读入的数据超过了a的大小,可能超过了数据段,把数据放到了代码段

就是数据在其本身申请的空间不足了之后,被存放到了内存中存放代码的地方

不过,这个问题应该和编译器有关,建议楼主试试别的编译器,看看是否也存在这样的问题!!

我也不是很确定的!我用TC,没有做这样的试验!!

jixingzhong at 2005-6-18 17:02:19 >
# 11 Re: 问个想不通的TC个人实验

建议写出这种代码的人应该与大众隔离.

notruiyi at 2005-6-18 17:31:15 >
# 12 Re: 问个想不通的TC个人实验

至少C和C++中不做此检查。

caojunliang at 2005-6-18 19:27:28 >

C/C++

All Classified