2011-12-22 114 views
-1

虽然我读一些C教程,我发现这条线,我不明白:c中的范围检查是什么?

C不范围检查

这是什么意思?

另一个小问题:如何在完成后暂停代码不要很快终止?我想我们说System("PAUSE")或类似的东西。我怎样才能在C?

+7

每个问题请提出一个问题。 C教程很愚蠢;得到一本书。作者可能在谈论如何在访问时未验证数组边界。为什么这个标记为C++?不要在程序中实现暂停;如果它在执行后消失,则是环境的错误,因此修复环境。 – 2011-12-22 12:05:12

+5

@ TomalakGeret'kal请对每条评论发表一条评论;) – MByD 2011-12-22 12:07:10

+0

@BinyaminSharet:;) – 2011-12-22 12:07:30

回答

1

这意味着您可以定义逻辑结果超出该类型允许的值范围之外的操作。例如

unsigned char a = 0xFF; 
unsigned char b = a + 1; 

编译器会非常高兴地允许这个,并返回0x00的结果。 0xFF + 1溢出一个字节存储的a。请注意,0x00只是正确答案'0x100'的低8位。

unsigned char a = 0xFF; 
unsigned b = (unsigned)a + 1; 

,其通过将其转换为更大的整数类型,并保存到一个较大型的第一使得用于在该值更大的空间:这可以通过进行修补。

类似的问题是边界检查在编译器会很乐意让你写:

int a[5] = {1, 2, 3, 4, 5}; 
i = 1000; 
b = a[i]; 

(编辑基于评论:) 这段代码执行后,异常可能会被抛出,但编译器根本不在乎。

+1

或者只是'unsigned b = a + 1',因为当值'0x100'被存储到'b'时,第一个例子中的绕回发生(假设'CHAR_BIT == 8'),而不是当'1'被添加到'0xFF'时。 – 2011-12-22 12:22:16

+0

@SteveJessop好点。 – 2011-12-22 12:23:23

+0

正如WTP在您删除的答案中所说的那样,'b'不保证在数组末尾有995个字的任意值。代码的行为是未定义的。它可能会崩溃,着火,为堆栈溢出等引发硬件异常,而不是将“b”设置为任何值。 – 2011-12-22 12:25:49

0

在Windows上,如果您有#included stdlib.h,您可以经常说系统(“暂停”)使环境等待您按回车。但是,您应该注意以下事项:

  • 它不被认为是近好的做法任何地方依靠pause.exe命令在当前环境中存在。在大多数Windows系统上可能都是如此,但在Unices或Mac上通常不适用。所以你会限制你的便携式程序到一个单一的平台。

  • 您可能想要考虑为什么您希望用户按Enter键。大多数人认为,如果程序开始工作,然后退出,这很好。 “真实”的程序以这种方式等待用户确认是非常罕见的。如果你只是想看看DOS提示符在它自己关闭之前说了些什么,也许问题出在DOS提示符而不是你的程序上?

我记得在开始编程时询问同样的问题,但后来我意识到在大多数情况下暂停程序是错误的。

+0

我一直在想为什么人们使用'system(“pause”);'? 'getchar()'有问题吗?非便携性是可取的还是什么? – Dave 2011-12-22 16:38:09

+0

@Dave输入缓冲区中可能存在文本,在这种情况下,getchar()不执行任何操作。我记得在C++中,获取输入的cin >>方法会在缓冲区中留下换行符,从而导致该技术失败。 – jforberg 2011-12-22 16:53:05

+0

然后'while(getchar()!= EOF);'应该这样做。这主要是因为IDE可以看到他们程序的输出,而按下'ctrl-d'并不难。 – Dave 2011-12-22 17:42:20