2011-02-04 25 views
1

這裏是C++新手。爲什麼文件中的數組的二進制保存有效? [C++]

我試圖找出以下行寫入緩衝區到一個文件:

fOut.write((char *)&_data, sizeof(_data)); 

_data =整數數組...

我有幾個問題:

  1. &_data地址數組的第一個元素?
  2. 無論地址是什麼,這是否意味着我們只保存數組的地址?那麼在我釋放它之後,我仍然可以訪問陣列呢?
  3. 我不應該通過sizeof(_data)*arrLength?傳遞int大小(在這種情況下)的意義是什麼,而不是整個數組的大小?
  4. 與地址打交道時是什麼鑄造成char*是什麼意思?

我真的很感激一些澄清。

+2

最好顯示`_data`的_exact_定義。無論如何,我對`&`懷有疑慮,這是確切的工作代碼嗎? – 2011-02-04 17:23:43

+0

_data只是一個數組...保存在堆上。是的,它的工作:) – prgDevelop 2011-02-04 17:32:12

回答

6

出乎您的評論,數組必須是自動或靜態存儲持續時間,以便sizeof工作。

  1. 這應該只是(char*)_data。數組的名稱隱式轉換爲指向第一個元素的指針。

  2. 沒有,write預期的指針,並存儲在該位置,沒有位置的地址中的內容。

  3. 編號由於_data是一個數組,sizeof (_data)是數組中所有元素的累積大小。如果_data是一個指針(例如當一個數組在堆上動態分配時),則需要numElems * sizeof(_data[0])。將指針的大小乘以元素的數量是沒有用的。

  4. 這意味着該地址的內容將被視爲一系列單獨的字節,失去了它可能具有的任何數字。這通常是爲了執行高效的數據批量複製,無論是往返文件,還是使用memcpy/memmove。數據類型應該是POD(普通的舊數據),否則會得到意想不到的結果。

如果_data是指向從堆中分配一個數組,作爲評論表明,那麼代碼是嚴重破壞。在這種情況下,您只保存地址,如果將文件加載到程序的同一實例中,該文件可能會工作,但這僅僅是因爲它正在同一地址的內存中查找數據。數據實際上不在文件中,如果您在加載文件之前重新啓動程序,則會發現數據已經消失。進行我在(1)和(3)中提到的更改,以保存完整的數組,無論它是分配給自動,靜態還是動態。

0
  1. 沒有,寫入使用該地址作爲第一位置,並通過的sizeof(_data)讀取寫入整個陣列
  2. 的sizeof(_data)將返回整個數組的大小不相同如的sizeof(int)的
  3. 裝置中的數據將被讀逐字節,這是通過寫入所需要的指針,因爲它以二進制格式寫入(逐字節)
+0

謝謝,但...我已經檢查過,不管我的數組是多大,sizeof(_data)返回4 ...所以我想這是int的大小。 – prgDevelop 2011-02-04 17:29:16

+0

我現在寫了cout <<&_data << endl <<&_data [0] << endl;並輸出兩個完全不同的地址。 – prgDevelop 2011-02-04 17:30:13

0

是& _data地址到數組的第一個元素?

是的。 這是在C和C++中將「引用」傳遞給數組的常用方法。如果您將數組本身作爲參數傳遞,整個數組內容將被複制,這通常是浪費和不必要的。 更正:您可以通過其中&_data,或只是_data。無論哪種方式,數組不需要被複制到堆棧。

無論地址是什麼,這是否意味着我們只保存數組的地址?那麼在我從內存中刪除他之後,我仍然可以訪問陣列呢?

不,該方法使用它獲取的地址來讀取數組內容;正如你指出的那樣,保存內存地址是毫無意義的。

不應該傳遞sizeof(_data)* arrLength?我的意思是...... 什麼是合格的尺寸爲int (在這種情況下)的邏輯和整個陣列的不是大小 ?

不,sizeof(_data)是數組的大小,而不是一個成員的大小。沒有必要乘以長度。

是什麼鑄造成char *與地址打交道時,意味着什麼?

強制轉換爲char *表示該數組以字節列表的形式存取;這是訪問和編寫原始值所必需的。

0

1)是,& _data是您的陣列的第一個元素的地址。
2)否,寫()中寫入已通過的sizeof(_data)起始地址爲& _data
3)您會通過的sizeof(int)的指定字節數* arrLength如果_data是指針到一個數組,但因爲它數組sizeof()返回正確的大小。
4)不知道。 )

0

閱讀此:http://www.cplusplus.com/reference/iostream/ostream/write/

  1. 應。
  2. ,如果你所說的「fstream.write(A,B)」,然後將其寫入b。從位置開始到文件(即什麼地址所指向)字節;
  3. 它應該是以字節或字符爲單位的大小。
  4. 並不多,類似於在更文明的語言中將東西強制轉換爲byte []。

順便說一句,它只會在裏面他們簡單值簡單數組工作...

我建議你看看>> < <運營商。

1

在處理地址時,鑄造char *意味着什麼 ?

想象這個簡單的例子

int x = 12; 
char * z = (char *)&x; 

而且假定一個體繫結構,其中int是4個字節長。來自C++標準sizeof(char)==1

在表達char * zchar *部分,你可以說,被用於指針運算

上我給的例子的第二行,什麼情況是,z現在指向第一(共4的出字節)即x。做一個++z;將使z點的第二個字節(在我的例子)4字節int

你可以說,聲明的左側部分用於指針運算,把事情簡單化。一個++(char *)會移動你一個字節,而一個++(int *)會移動你相應的字節數int佔用內存。

相關問題