定义了一个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");
答案 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时,相邻的内存。
可能你需要重新思考你想要做的事情并从不同的角度来看待它。