Visual C ++“Debug Assertion Failed”

时间:2012-01-16 08:40:04

标签: visual-studio-2010 visual-c++

我使用Visual Studio 2010编译了代码,然后我尝试运行它,不幸的是在测试期间有时候我有错误“Debug Assertion Failed!”....表达式(未加工)(c + 1)&lt ; = 256

然后我尝试了相同的场景但是使用gcc并且它运行没有任何问题。知道这个问题怎么样?

4 个答案:

答案 0 :(得分:5)

您正在调用isalpha()或isdigit()之类的函数,其整数的值不是单字节0-255。

答案 1 :(得分:3)

有一段代码说“此时,我们希望表达式(unsigned)(c + 1) <= 256为真;如果不是,请在此时停止执行并进入调试器”。

进入调试器的方法取决于平台,可能无法正确实现gcc。我会在项目中查找这段代码,然后尝试找出为什么c应该小于或等于255,以及是什么使它超出范围;让程序运行到触发断言的位置会给出错误条件的隐含断点,从那开始。

答案 2 :(得分:2)

我发现问题的原因是每个编译器如何声明字符。在Visual Studio中,默认值为Signed char。因此,除非您使用无符号字明确地在其声明之前,否则每个字符都会被签名。因此在VS中,字符的范围是-128到127,如果读取的char具有大于128的ASCII,则它在VS中将具有负代码。由于这种情况不在函数isalpha,isdigit等处理,因此函数将失败。 在gcc中,将char设置为sign或unsigned的使用方法类似于动态预处理器。

答案 3 :(得分:1)

对于RowData函数的意外输入,您已成为未定义行为的受害者。根据{{​​3}}:

  

在所有情况下,参数都是<ctype.h>,其值应表示为int或等于宏unsigned char的值。如果参数具有任何其他值,则行为未定义。

换句话说,如果EOF不在x[0..UCHAR_MAX]的范围内,则不得将其传递给任何EOF函数。被抛出的断言是一种相当有礼貌的方式,让你知道你违反了这条规则;大多数人只会让可怕的事情发生(例如,我可以想象出心脏的错误)。