【问题标题】:0xC0000005: Access violation writing location0xC0000005:访问冲突写入位置
【发布时间】:2012-12-05 01:41:22
【问题描述】:

我有这个从文件中读取文本的功能:

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 写入*data,但不能使用using *data[size] = '\0'

【问题讨论】:

  • 运算符优先级 - 你想要(*data)[size],而不是*data[size]
  • 正如@PaulR 所说...通常我更喜欢存储一个临时的char* 变量并在函数中使用它,然后在返回之前通过char** 存储它。这样我就避免了可能导致错误和/或眼睛酸痛的额外语法错误。 =)
  • 0xCC 表示您已阅读uninitialized memory

标签: c++


【解决方案1】:

您遇到了运算符优先级问题 - 您需要 (*data)[size],而不是 *data[size]

【讨论】:

  • arg 不错!我忘记了!谢谢!
【解决方案2】:

您的问题是运算符*[] 的优先级。 *data[size] 表示访问数据中的第n个char*,然后解引用它的第一个字符,而不是获取data指向的数组的第n个字符。

您希望(*data)[size] 以正确的顺序执行操作。

编辑:由于这是 C++,你最好使用char*&amp; 来消除这些问题,或者很多最好使用vector 并让标准库管理你的内存你!

【讨论】:

  • 我通常使用标准容器,但在这种情况下,在我的情况下,原始指针更好;)我只是忘记了运算符优先级:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多