使用此代码:
#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
答案 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)c
与ffffffff
相同。这是因为c
被分配了ff
,超出了-128到127的限制。它被包裹到-1
。然后将其转换为int值-1
,并将int值-1
编码为ffffffff
。
注意:正如许多其他人所写,您的程序有未定义的行为。这意味着当您在不同的编译器,不同的计算机或甚至不同版本的编译器上运行时,您的程序可能会打印其他内容或崩溃。在程序中包含未定义的行为被认为是不好的做法。