gpt4 book ai didi

C 数组值有时会被取反

转载 作者:太空宇宙 更新时间:2023-11-04 08:21:27 27 4
gpt4 key购买 nike

我试图将一个整数值放入一个字符数组中,这样我就可以拥有字节可寻址内存。当我将要放置的整数和指向数组的字符指针传递到我的函数中时,它们具有正确的值。赋值后整数指针保持正确值但字符指针具有负值。这只发生十分之二,并且每次都出现在相同的两个数字上。这是函数的一个片段

//Places an int into an array at memLocation
void PutIntAt(int i, char *arr)
{
printf("value: %i at: %i\n", i, arr - &mainMemory[0]);
int *pos = (int*)arr;
*pos = i;
printf("*pos is: %x *arr is: %x\n", *pos, *arr);
}

我从中得到的输出

value: 150 at: 28
*pos is: 96 *arr is: ffffff96
value: 50 at: 32
*pos is: 32 *arr is: 32
value: 20 at: 36
*pos is: 14 *arr is: 14
value: 10 at: 40
*pos is: a *arr is: a
value: 5 at: 44
*pos is: 5 *arr is: 5
value: 500 at: 48
*pos is: 1f4 *arr is: fffffff4
location 48 = -12

我正在用 gcc 编译并使用 -o 选项和 -std=gnu99 选项。
mainMemory 数组是一个全局变量。不确定为什么会这样。

最佳答案

您为 printf 使用了错误的格式说明符。这会导致未定义的行为。

您使用 %x,它需要 unsigned int,但提供了 *arr,它是一个 char。在您的系统上,char 有一个包含负值的范围。

要解决此问题,您可以使用 %hhd%d 说明符(后者由于默认参数提升而起作用)。如果你想将 char 转换为 unsigned 那么你必须编写代码来执行转换,例如:

printf("%x\n", (unsigned char)*arr);

注意:printf 规范写得不是很清楚,但一般认为 %u%x 可以与任何被提升为 a 的较小参数一起使用非负整数。因此,您可以在我的示例中使用 %x 而不是 %hhx

关于C 数组值有时会被取反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33228067/

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