2011-02-04 58 views
3

作为这个问题的背景,这是我编写的一个测试程序,用于调查我们在我工作的消息程序中看到的一些奇怪行为。我们有各种使用位标志来保存消息状态的结构,一些标志使用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; 
} 
+4

您可能需要明确初始化`flag2` 0 – mtrw 2011-02-04 16:47:03

+0

flag2很短,但是你正在将它指向char *,使用short *代替(g应该也是short类型)。 – codymanix 2011-02-04 16:57:01

+0

我在HP UX上运行该程序,它根本不打印任何内容,但是当我在Fedora上运行相同的程序时,它可以正常工作。 – Ibrahim 2011-02-04 16:58:59

回答

4

AIX是一个大尾结构,这意味着g点至flag最显著字节。这意味着对g不可见对最低有效字节的任何更改。

flag2也从来没有初始化,所以它会包含一些arbirary值。所以事实证明,你认为一些设置的工作,当它只是在一开始就存在的arbirary价值。

如果你运行在像x86这样的小型机器上,事情应该像预期的那样运行。

0

我看到一些可能是问题的事情。

  1. 您还没有初始化flag2

  2. 你可能想投g= (short * ) &flag2,因为如果你投以 字符,你不一定会得到 到最低 显著8位的参考。

0

维基百科的pointers

甲2005 C标准 的草案要求铸造从一种类型的衍生的 一个指针 另一种类型的应保持对于两种类型的 的 对准正确性(6.3 。.2.3指针,参数7):[3]

char *external_buffer = "abcdef"; 
int *internal_data; 

internal_data = (int *)external_buffer; // UNDEFINED BEHAVIOUR if "the resulting pointer 
             // is not correctly aligned" 

底线:使用正确的指针类型

该行为可能按预期工作,但不能保证。

C++ 03 Standard $ 5.3。3/1表示,的的sizeof应用于任何其它 基本类型(3.9.1)

sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; the 

结果是 实现定义的。 [注:在 特别的sizeof(布尔)和 的sizeof(wchar_t的)是 实现的defined.69)

看看这个:C++ Size of primitives