我试图将一个整数值放入字符数组中,这样我就可以有字节可寻址的内存。当我将要放置的整数和数组的字符指针传递给我的函数时,它们具有正确的值。赋值后,整数指针保持正确的值,但字符指针具有负值。这只发生在十次中的两次,每次都在相同的两个数字上。 这是函数的片段
//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);
}
我从这个i得到的输出
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
数组是一个全局变量。不知道为什么会这样。
答案 0 :(得分:2)
您使用的printf
格式说明符错误。这会导致未定义的行为。
您使用的%x
需要unsigned int
,但提供的*arr
是char
。在您的系统char
上有一个包含负值的范围。
要解决此问题,您可以使用%hhd
或%d
说明符(后者因默认参数提升而起作用)。如果要将char
转换为unsigned,则必须编写代码来执行转换,例如:
printf("%x\n", (unsigned char)*arr);
注意:printf规范写得不是很清楚,但通常会解释为%u
和%x
可以与任何较小的参数一起使用,该参数会被提升为非负整数。因此,我可以在我的示例中使用%x
而不是%hhx
。