fwrite失败(返回0,perror给出“Bad address”)

时间:2011-11-02 05:25:57

标签: c++ fwrite

出现此类错误的可能原因是什么?写入的文件创建没有问题,但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 个答案:

答案 0 :(得分:1)

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

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

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

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

  4. 您正在编写C ++代码。你正在摧毁一个班级。 free 不应该在您的代码中的任何位置!您是否使用Node* node创建了malloc?我希望不会!如果您使用new必须使用delete

  5. 您可以在a中释放b~Node,但不会将它们分配到任何地方。如果你没有在构造函数中分配它 - 当你在析构函数中删除它 - 验证你分配它们时,否则你也会在这里获得一堆未定义的行为。

  6. 只是有些事情不禁让人注意,希望有所帮助。