2013-10-05 140 views
1

我嘗試編寫使用堆棧來呈現某種數據(char,double或string)的程序。在char []緩衝區中保存double值

char *data_buffer; 
double n; 
... 
data_buffer = (char*)malloc(4096 * sizeof(char)); 
... 
*(data_buffer + buffer_top) = n; //buffer_top - just offset for first byte 
... 
printf("%f ", (double)*(data_buffer + buffer_top)); 

變量data_buffer和buffer_top正確。 但輸出很奇怪。它只在n的情況下才會更正。< 127. 它爲什麼會這樣?

P.S.我不想改變data_buffer的類型,因爲它也包含char和不同長度的字符串。工作

例(!! - n個測試輸出寫入之前緩衝:

126 //push 
!! 1.260000e+02 
127 // push 
!! 1.270000e+02 
128 // push 
!! 1.280000e+02 
. // pop 
-128.000000 //error 
. //pop 
127.000000 //ok 
. //pop 
126.000000 //ok 
123456 // push 
!! 1.234560e+05 
. //pop 
64.000000 //error 

回答

1

兩條線都缺少強制到(double *),所以他們做了char分配和讀取,分別這裏的。 。加入你的代碼實際上有一些明確的(char)石膏做凸顯了不正確的類型轉換

*(data_buffer + buffer_top) = (char) n; 
... 
printf("%f ", (double) (char) *(data_buffer + buffer_top)); 

你想要的是:

*((double *) (data_buffer + buffer_top)) = n; 
... 
printf("%f ", *((double *) (data_buffer + buffer_top))); 
+1

除非'buffer_top'被認爲是double的對齊要求的倍數,否則這些操作應該通過在緩衝區和臨時'double'對象之間複製字節來實現。正如所寫的,這可以具有C標準未定義的行爲。 –