无法从int值中提取字节数组值

时间:2014-02-25 05:58:58

标签: c arrays unions

定义了一个union,并给出了一个整数值。估计所需的阵列大小。以下值定义为union。但是,无法打印字节数组值(即,以下代码的最后部分未打印)。 给出:

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");

1 个答案:

答案 0 :(得分: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)bytes。没有理由动态分配它。

您可以将结构更改为:

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

我假设你要做的是计算出对targetValue值进行编码的最小字节数,并创建一个完全相同大小的联合。

关于联合的另一个理解是它们总是占用其最大成员的空间量,所以即使动态分配联合,你也必须使它至少为sizeof(int)long,否则你会腐败每当你写入int时,相邻的内存。

可能你需要重新思考你想要做的事情并从不同的角度来看待它。