gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:12 25 4
gpt4 key购买 nike

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

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

在主函数中

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

最佳答案

在你的 union 中,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 的值进行编码,并创建一个恰好该大小的 union 。

关于 union 的另一件事是,它们总是占用其最大成员的空间量,因此即使动态分配 union,您也必须使其至少 sizeof(int) 长,否则您会损坏每当您写入 int 时,相邻内存。

可能您需要重新考虑您正在尝试做的事情并从不同的角度来处理它。

关于c - 无法从 int 值中提取字节数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22005845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com