Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C数组值有时会被否定_C_Arrays_Pointers_Casting - Fatal编程技术网

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之前被正确转换了一行。@jgleesti
arr
是如何声明的?这是因为您将一个字符传递给printf,即*arr,但您告诉格式说明符将其解释为32位十六进制值。相比之下,*pos是一个插入式%hhd,两个指针都打印一个负值。我认为这让我走上了正确的方向。我猜他们打印负值是因为整数占用了两个字节的空间,而我只打印了一个字节?他们打印负值是因为你传递了一个负值作为参数。您的代码基本上是
printf(“%d”,-2)-2
。考虑使用<代码>无符号char * ARR < /代码>。哇哦…这段时间我一直认为
%I
是用于无符号整数的。我确信我传递了一个正值,结果却不是。谢谢@M.M.。感觉有点不好意思now@jgleesti
%i
是printf中
%d
的同义词。(在scanf中有不同的含义)。