我可以将指向结构的指针类型转换为带符号的值以返回不同类型的错误吗。C标准是否允许这种行为,或者是一种未定义的行为。
typedef enum lError
{
l_OK = 0,
l_ERROR = -1,
l_ABORT = -2,
l_HALT = -3
}L_STATUS;
typedef struct dataCards
{
int card1;
int card2;
char flag;
}DATACARD;
DATACARD dataCardG;
DATACARD *getCard(int i)
{
if(i == 1)
return &dataCardG;
else if (i == 2)
return (DATACARD *)l_ERROR;
else if (i==3)
return (DATACARD *)l_ABORT;
else
return (DATACARD *)l_HALT;
}
int main ()
{
DATACARD *ptr = NULL;
ptr = getCard(3);
if(ptr < (DATACARD *) 1) /* Is this allowed or undefined behaviour */
printf("Card failed\n");
}
我怎样才能让这个条件起作用?
这是未定义的行为。
规范(下面)有点长,但关键是getCard()
返回像(DATACARD*)some_int
这样的值。这并不是说some_int
可能是负的,它可能是除0之外的任何整数,仍然会带来问题。由于返回值可能不是基于(DATACARD*)
类型的真实存在的变量,而不是NULL,因此任何此类比较都是未定义的。
推荐使用@Eric Postbitchil:
DATACARD okay, ...
#define Okay (&okay)
此外,(DATACARD*)-1
的结果不一定是负指针。我还没有找到C规范来确认指针是否有符号、无符号或两者之一。(规范可能存在。)-1
当然是负的,但是这种派生指针的符号性是不确定的。
C11dr 6.5.8 5"当比较两个指针时,结果取决于指向的对象在地址空间中的相对位置。如果指向对象类型的两个指针都指向同一个对象,...或者如果指向的对象是同一个聚合对象的成员,...在所有其他情况下,行为是未定义的。"
UNIX sbrk()函数依赖于这种工作,因为它返回-1作为指示特定情况的指针值。因此,尽管C标准不能保证它会工作......它会工作。
不过,为了比较值,请始终将指针强制转换为整数类型,而不是相反。这将避免64位系统上的位宽问题,并确保您在有符号的上下文中进行操作。
C标准“允许”这一点,但不支持它。也就是说,它没有定义如果您尝试此操作会发生的行为。您的C实现也可能没有定义尝试此操作时发生的行为。
不要这样做。
你可以通过创建实际对象来合法地完成这项工作:
DATACARD okay, error, abort, halt
#define Okay (&okay)
#define Error (&error)
#define Abort (&abort)
#define Halt (&halt)
如果DATACARD
较大,并且您不想为这些额外的对象浪费空间,还有其他可用的技术。通常,像getCard
这样的例程将被定义为在出错时返回NULL
,并通过单独的机制提供错误代码,例如指向存储错误代码的位置的附加参数。
我在64位机器上的C程序出错。错误如下。为了完全理解错误,我尝试了程序的一些变体,以查看何时没有出现错误/警告。随着变化,我希望更好地理解它。 这些程序是用 错误:有符号和无符号整数表达式之间的比较 这个程序给了我错误。这就是我看到的模式。 sizeof返回size_t,它是一个无符号长整数。 len被提升为unsigned long int,作为常规算术的一部分,因此它可以从size_t中减去
为什么下面的返回为假?
我正在尝试将哈希检查从服务器应用程序移动到PostgreSQL。换句话说,我需要调用一个对PGSQL的查询,它将来自查询的字符串与来自字段的字符串进行比较,并将相等比较的结果返回为bool,但如果没有关于clear SQL的过程,我不知道如何实现这一点。 upd:我有字段密码的表用户(当前为文本,将来为bytea)。我想写点什么 它必须返回true或false作为相等比较的结果。
我很难找到一个好方法来找到一列中的所有负条目,并将它们向上移动,与现有条目相加(即从当前条目中减去负条目),直到所有值都为正。 重要的是,最终数据帧没有负值 根据此处已提供的表格: 出席: 渴望的:
我有一个本地数据库,一个登录页面和一个servlet。我可以从数据库中获得我想要的值,例如用户名和密码。我还可以在html登录表单中获得用户输入。我对HTML使用Request.GetParameter。我想检查数据库中的用户名是否等于输入的用户名,以及数据库中的密码是否等于输入的密码,否则访问被拒绝。这是我的代码:
我创建了一个,当调用变量为ISE时,它会读取相关数据的表。但是,如果我尝试将与另一个对象进行比较,无法正确读取。我想告诉脚本,如果现有CSV中的任何行与匹配,则不会将数据导出到CSV,换句话说,跳过CSV文件中的重复行。CSV可能有也可能没有多行。