作为这个问题的背景,这是我编写的一个测试程序,用于调查我们在我工作的消息程序中看到的一些奇怪行为。我们有各种使用位标志来保存消息状态的结构,一些标志使用char,一些使用短路。我们必须将消息转储到平面文件的实用程序使用这些标志值上的char *来提取设置,因此我故意在flag2上使用了不同的指针。C指针和位设置问题
当该程序是在AIX UNIX 6.1运行为什么是输出:
2设置
4设置
8设置
16设置
64设置
发生了什么变化值1和32?
#include <stdio.h>
#define SET(x,y) y |= (x)
#define UNSET(x,y) y &= (~x)
int main (int argc, char *argv[])
{
unsigned char *g;
unsigned short *h;
unsigned long *i;
char flag1;
short flag2;
long flag3;
g = (char*) &flag2;
SET(1, flag2);
if (1 & *g)
printf("1 set\n");
UNSET(1, flag2);
SET(2, flag2);
if (2 & *g)
printf("2 set\n");
UNSET(2, flag2);
SET(4, flag2);
if (4 & *g)
printf("4 set\n");
UNSET(4, flag2);
SET(8, flag2);
if (8 & *g)
printf("8 set\n");
UNSET(8, flag2);
SET(16, flag2);
if (16 & *g)
printf("16 set\n");
UNSET(16, flag2);
SET(32, flag2);
if (32 & *g)
printf("32 set\n");
UNSET(32, flag2);
SET(64, flag2);
if (64 & *g)
printf("64 set\n");
UNSET(64, flag2);
return 0;
}
您可能需要明确初始化`flag2` 0 – mtrw 2011-02-04 16:47:03
flag2很短,但是你正在将它指向char *,使用short *代替(g应该也是short类型)。 – codymanix 2011-02-04 16:57:01
我在HP UX上运行该程序,它根本不打印任何内容,但是当我在Fedora上运行相同的程序时,它可以正常工作。 – Ibrahim 2011-02-04 16:58:59