影响到char数组的int,为什么printf会显示这个?

时间:2017-01-26 09:12:56

标签: c

使用此代码:

#include <stdio.h>
#include <unistd.h>

int main()
{

  char buffer[64];
  int check;
  int i = 2;

  buffer[-2] = i;
  printf("%x\n",buffer[-2]);

  i=25;
  buffer[-2] = i;
  printf("%x\n",buffer[-2]);

  i=255; 
  buffer[-2] = i;
  printf("%x\n",buffer[-2]);   

  return 0;
}

我得到了这个输出(用gcc和-m32选项编译)。

2
19
ffffffff

所以,我可以理解两个第一个值(2和19),但我真的不明白第3个,因为255等于ff而不是ffffffff。

你知道为什么会这样显示吗?

谢谢

p.s:请不要建议将“chars”影响到“char”数组,此代码仅用于培训,谢谢。

p.s(bis):请不要说它无效,因为如果是,为什么程序的前两个输出按照代码??

我用gcc -m32 -o code code.c

编译了这段代码

3 个答案:

答案 0 :(得分:2)

  

你知道它为什么会这样显示吗?

不,因为您的程序有未定义的行为

buffer[-2] = i; 
//     ^^

您正在访问buffer越界,导致 UB - 因此可能发生任何事情

答案 1 :(得分:2)

 buffer[-2] = i; //invalid; out of range

它无效,因为您将访问数组边界之外的内存。请参阅此stack overflow答案。

答案 2 :(得分:2)

您似乎在询问此代码的行为:

int i = 255;
char c = i;
printf("%x\n", c);

它打印ffffffff的原因是因为printf是一个vararg函数,所以小于int的所有整数类型都被提升为int。所以你可以写:

int i = 255;
char c = i;
printf("%x\n", (int)c);

然后问题出现了,为什么(int)cffffffff相同。这是因为c被分配了ff,超出了-128到127的限制。它被包裹到-1。然后将其转换为int值-1,并将int值-1编码为ffffffff

注意:正如许多其他人所写,您的程序有未定义的行为。这意味着当您在不同的编译器,不同的计算机或甚至不同版本的编译器上运行时,您的程序可能会打印其他内容或崩溃。在程序中包含未定义的行为被认为是不好的做法。