C数组值有时会被否定
我试图把一个整数值放入一个字符数组,这样我就可以有字节可寻址内存。当我将要放置的整数和指向数组的字符指针传递到函数中时,它们具有正确的值。赋值后,整数指针保持正确的值,但字符指针具有负值。这种情况十次中只发生两次,每次都发生在相同的两个数字上。。 下面是函数的一个片段C数组值有时会被否定,c,arrays,pointers,casting,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,
//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
,它需要无符号int
,但提供的*arr
是字符
。在您的系统上,char
的范围包括负值
要解决此问题,可以使用%hhd
或%d
说明符(后者由于默认参数提升而起作用)。如果要将char
转换为unsigned,则必须编写代码来执行转换,例如:
printf("%x\n", (unsigned char)*arr);
注意:printf规范写得不是很清楚,但通常解释为
%u
和%x
可以与提升为非负整数的任何较小参数一起使用。因此,在我的示例中,您可以使用%x
而不是%hhx
。Q:不确定为什么会发生这种情况。。。答:可能是因为*arr和mainMemory都可能被定义为char,而有符号char算术>=128的任何结果都将导致一个负数?如果不查看代码的其余部分,很难看出问题出在哪里。请发布一个@ameyCU当我声明主内存时,我使用以下行静态执行:char main memory[MEM_SIZE];MEM_SIZE为5000@paulsm4最初我也这么认为,但值300在150之前被正确转换了一行。@jgleestiarr
是如何声明的?这是因为您将一个字符传递给printf,即*arr,但您告诉格式说明符将其解释为32位十六进制值。相比之下,*pos是一个插入式%hhd,两个指针都打印一个负值。我认为这让我走上了正确的方向。我猜他们打印负值是因为整数占用了两个字节的空间,而我只打印了一个字节?他们打印负值是因为你传递了一个负值作为参数。您的代码基本上是printf(“%d”,-2)你问为什么它会打印-2
。考虑使用<代码>无符号char * ARR < /代码>。哇哦…这段时间我一直认为%I
是用于无符号整数的。我确信我传递了一个正值,结果却不是。谢谢@M.M.。感觉有点不好意思now@jgleesti%i
是printf中%d
的同义词。(在scanf中有不同的含义)。