fwrite 失败(返回 0,错误给出 "Bad address")

fwrite fails (returns 0, perror gives "Bad address")

本文关键字:Bad address 错误 失败 返回 fwrite      更新时间:2023-10-16

出现这种错误的可能原因是什么?写入文件的创建没有问题,但是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给出"坏地址"作为错误。

我不确定我在这里能给你一个答案,但我认为值得指出我在你的代码中看到的一些东西。我希望解决这些问题能帮助你克服你的问题。

  1. 当你有一个类,你想转储到一个文件-让类为你做的工作。这意味着,您的Node类将具有write/read集,或operator<</operator>>或您将调用的任何其他常规例程集,并让它将自身序列化到文件中,然后在读取时从文件中反序列化自己。Boost也提供了一些工具来帮助你完成这些。

  2. 转储类指针的内容是一件危险的事情,特别是,如果您在一个体系结构上转储,并在另一个体系结构上读取(在您的情况下32LE vs 64BE)。肯定会以各种不可预测的方式失败。

  3. 您访问从某处获得的指针而不验证其有效性。我不知道在你调用push之前是否对你的ptr进行了测试,但我确信检查push本身的指针是有帮助的,特别是如果错误表明它可能不好。

  4. 你在写c++代码。你在毁掉一个班级。 free 不应该出现在你的代码中!你正在用malloc创建Node* node ?我希望不会!如果你正在使用new,那么必须使用delete

  5. 你在~Node中释放ab,但你没有在任何地方分配它们。如果你没有在构造函数中分配它——当你在析构函数中删除它时——验证你已经分配了它们,否则你也会在这里得到一堆未定义的行为。

只是一些忍不住注意到的事情,希望能有所帮助。