C数组值有时会被否定

时间:2015-10-20 04:33:16

标签: c arrays pointers casting

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

//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数组是一个全局变量。不知道为什么会这样。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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