出现这种错误的可能原因是什么。正在写入的文件创建没有问题,但 fwrite
每次都失败。
我正在从 32 位小端移植到 64 位大端。
我写的结构是
struct Node
{
uint8_t *a;
uint32_t *b;
uint32_t c;
uint32_t d;
uint32_t e;
uint32_t f;
uint32_t g;
uint16_t h;
uint8_t i;
uint8_t j;
uint8_t k[MAX];
uint32_t (*l)[2];
uint32_t m;
uint32_t n;
Node() {
memset(this, 0, sizeof(*this));
l = NULL;
a = (uint8_t*)calloc(N,1);
}
~Node() {
free(a);
free(b);
}
};
写节点的代码是
void push(void *ptr)
{
Node *node = (Node *) ptr;
assert(fwrite(node, sizeof(Node), 1, fpw) == 1);
free(node);
}
fpw
具有全局作用域。
当我尝试调试时,我发现 fwrite
返回 0 并且 perror
给出“Bad address”作为错误。
如有任何建议,我们将不胜感激。
最佳答案
我不确定我在这里能为您提供答案,但我认为值得指出我在您的代码中看到的一些内容。我希望解决这些问题会帮助您克服问题。
当您有一个要转储到文件中的类时 - 让该类为您完成工作。这意味着,您的
Node
类将有一个write
/read
设置,或operator<<
/operator>>
或您将调用的任何其他常规例程集,并将其自身序列化为文件,然后在读取时从文件中反序列化自身。 Boost为您提供tools也可以为此提供帮助。转储类指针的内容是一件危险的事情,尤其是如果您在一个架构上转储并在另一个架构上读取(在您的情况下是 32LE 与 64BE)。它肯定会以各种不可预测的方式失败。
您在未验证其有效性的情况下访问从某处获得的指针。我不知道你有没有测试你的
ptr
在你打电话之前push
, 但我相信检查push
中的指针会有帮助本身,特别是如果错误表明它可能不好。您正在编写 C++ 代码。你正在毁掉一个类(class)。 <强>
free
不应该在你的代码中的任何地方!您正在创建Node* node
与malloc
?我希望不会!如果您使用new
你必须使用delete
.您正在释放
<a
和b
在你的~Node
,但您不会将它们分配到任何地方。如果你没有在构造函数中分配它——当你在析构函数中删除它时——验证你分配了它们,否则你也会在这里得到一堆未定义的行为。
只是一些忍不住注意到的东西,希望对你有帮助。
关于c++ - fwrite 失败(返回 0,perror 给出 "Bad address"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7976168/