2012-12-17 126 views
0

我有這個功能從文件中讀取文本:0000005:訪問衝突寫入位置

uintmax_t ResourcePack::getText(const string& file, char** data) 
{ 
    *data = new char[static_cast<size_t>(size) + 1]; 
    fseek(_fileDescriptor, static_cast<long>(begin), SEEK_SET); 
    fread(*data, static_cast<size_t>(size), 1, _fileDescriptor); 
    *data[size] = '\0'; 
} 

FILE* _fileDescriptor, uintmax_t sizeuintmax_t begin都獲得其他代碼,這裏並不重要,但正確的價值觀。

fseekfread行工作正常。 實際上,我有* data中的文件內容,但是當最後一行被執行時,我得到了訪問衝突。

爲什麼我可以使用fread而不是using *data[size] = '\0'寫入*data

+9

運算符優先級 - 您想要'(* data)[size]',而不是'* data [size]'。 –

+3

正如@PaulR所說......通常我更喜歡存儲一個臨時的'char *'變量,並在函數中處理它,然後在返回之前通過'char **'存儲它。這樣我就避免了可能導致錯誤和/或眼睛痠痛的額外語法錯誤。 =) – paddy

+0

0xCC表示您已閱讀[未初始化的內存](https://stackoverflow.com/q/370195/995714) –

回答

5

您遇到了運營商優先級問題 - 您需要(*data)[size],而不是*data[size]

+0

arg不錯! 我忘了! 謝謝! – danikaze

3

你的問題是運營商的優先級*[]*data[size]表示訪問數據中的第n個char*,然後取消引用其第一個字符,而不是獲取data指向的數組的第n個字符。

您希望(*data)[size]改爲按照正確的順序執行操作。

編輯:由於這是C++你會更好使用char*&消除這些各種各樣的問題了,或者最好使用vector,並讓標準庫管理你的內存爲您服務!

+0

我通常使用std容器,但對於這種情況,原始指針在我的情況下更好;) 我只是忘記了運算符的優先級:P – danikaze