原来new出来的变量还有这种情况

Posted on 2009-08-14 22:04  liuyanghejerry  阅读(268)  评论(1编辑  收藏  举报
环境解释: 
BCB2009 
代码目的是读取文件的一部分,最终以16进制的形式选择性的输出到文本框里。 
Dtype.Start_Offset在这里是0x44E872 
其数据依次如下: 
0000CDBFBFBEFF 

诡异的地方: 
blockA,blockB,blockD,blockE都是正常的,分别被输出为CD BF BE FF 
但是blockC却被输出为B0A8BF,百思不得其解…… 

代码如下: 

 1 
 2   int *blockA = new int
 3   int *blockB = new int
 4   int *blockC = new int
 5   int *blockD = new int
 6   int *blockE = new int
 7   switch (Dtype.Language_Type ) { 
 8   case 1
 9 
10   fseek(fpIn,Dtype.Start_Offset+0x2,0); 
11   fread(blockA,1,1,fpIn); 
12   fseek(fpIn,Dtype.Start_Offset+0x3,0); 
13   fread(blockB,1,1,fpIn); 
14   Edit5->Text =AnsiString(IntToHex(*blockA,2)) 
15   +AnsiString(IntToHex(*blockB,2)); 
16 
17   break
18   case 2
19   fseek(fpIn,Dtype.Start_Offset+0x2,0); 
20   fread(blockA,1,1,fpIn); 
21   fseek(fpIn,Dtype.Start_Offset+0x3,0); 
22   fread(blockB,1,1,fpIn); 
23   fseek(fpIn,Dtype.Start_Offset+0x4,0); 
24   fread(blockC,1,1,fpIn); 
25   fseek(fpIn,Dtype.Start_Offset+0x5,0); 
26   fread(blockD,1,1,fpIn); 
27   fseek(fpIn,Dtype.Start_Offset+0x6,0); 
28   fread(blockE,1,1,fpIn); 
29   Edit5->Text = AnsiString(IntToHex(*blockA,2)) 
30   +AnsiString(IntToHex(*blockB,2)) 
31   +AnsiString(IntToHex(*blockC,2)) 
32   +AnsiString(IntToHex(*blockD,2)) 
33   +AnsiString(IntToHex(*blockE,2)); 
34   ShowMessage(AnsiString(IntToHex(*blockC,2))); 
35   break
36   
37   case 3
38 
39   fseek(fpIn,Dtype.Start_Offset+0x2,0); 
40   fread(blockA,1,1,fpIn); 
41   fseek(fpIn,Dtype.Start_Offset+0x3,0); 
42   fread(blockB,1,1,fpIn); 
43   Edit5->Text =AnsiString(IntToHex(*blockA,2)) 
44   +AnsiString(IntToHex(*blockB,2)); 
45   ShowMessage("Wait");


后来发到CSDN,终于得到了解释:

int 是 4 字節 , 你只讀了 一個字節進去 。 余下的三個字節是隨機值。 

X86 機器 是小端字节序 , 如果你沒填充的那三個字節不是0 , 就出現你現在的情況了。 

只讀一下字節的話,用 byte 或 char 來接收就行了。 
——By PPower

原本一直以为new出来的变量都被充分的初始化的,现在看来完全错误了啊……

Copyright © 2024 liuyanghejerry
Powered by .NET 8.0 on Kubernetes