2014-02-25 44 views
0

定义了一个联合,并给出一个整数值。估计所需的阵列大小。以下值被定义为工会。但是,字节数组值无法打印(即以下代码的最后一部分未打印)。 考虑:无法从int值中提取字节数组值

union { 
    unsigned int integer; 
    //unsigned char byte[4]; 
    unsigned char* byte; 
} foo; 

在main()

int i; 

int numberOfBytes = 1; 
int targetValue = 123456789; 
int sum = 0; 
sum = pow(16, numberOfBytes); 

while (sum < targetValue) { 
    //printf("Trying value: %d \n", (16^numberOfBytes)); 
    numberOfBytes++; 
    sum += pow(16, numberOfBytes); 
} 
numberOfBytes++; // add 1 more byte space 
printf("Number of Bytes: %d \n", numberOfBytes); 
printf("Sum: %d \n", sum); 


foo.byte = malloc(sizeof(unsigned char)*numberOfBytes); 

if (foo.byte == NULL) 
    printf("malloc fail\n"); 

// clear foo 
for (i=numberOfBytes; i >= 0;i--) { 
    foo.byte[i] = 0; 
} 

foo.integer = targetValue; 
printf("Trying value: %d \n", foo.integer); 

下不打印:

for (i=numberOfBytes; i >= 0;i--) { 
    printf("%x ", foo.byte[i]); 
} printf("\n"); 
+0

数组与指针不一样。编辑:当联合有字节数组时,int重叠前4个字节。当union有一个指针时,int重叠指针本身 - 不是指针指向的前4个字节。 – immibis

+0

在工会中,他们共享相同的空间。我们应该如何解决这个问题,而不是设置固定的数组大小? – Babbit

回答

2

在你的工会,foo.byte是一个指向的内存区域。这:

foo.byte = malloc(sizeof(unsigned char)*numberOfBytes); 

被设置foo.byte的指针,你动态分配的内存区域。然后这样的:

foo.integer = targetValue; 

覆盖该指针与价值。

那么这个:

for (i=numberOfBytes; i >= 0;i--) { 
    printf("%x ", foo.byte[i]); 
} printf("\n"); 

会尝试去参考targetValue的价值,这将可能给你一个段错误。

问题是,既然您将targetValue声明为int,它将始终为sizeof(int)个字节长。没有理由动态分配它。

您可以将结构变更为:

union { 
    unsigned int integer; 
    unsigned char byte[sizeof(int)]; 
} foo; 

我假设你正在尝试做的是找出的最小字节数编码targetValue的价值,创造正是大小的联合。

另一件关于工会的理解是,他们总是占用最大成员的空间,所以即使动态分配工会,也必须至少使sizeof(int)长,否则你会每当你写入int时就会破坏邻近的内存。

也许你需要重新思考你正在尝试做什么,并从不同的角度来接近它。