2012-12-17 72 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