首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fwrite失败(返回0,perror给出“坏地址”)

fwrite失败(返回0,perror给出“坏地址”)
EN

Stack Overflow用户
提问于 2011-11-02 05:25:57
回答 1查看 1.7K关注 0票数 0

造成这种错误的可能原因是什么。被写入的文件没有问题,但是每次fwrite都会失败。

我正在从32位的小终端移植到64位的大端。

我所写的结构是

代码语言:javascript
复制
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);
}
};

编写节点的代码是

代码语言:javascript
复制
void push(void *ptr)
{
Node *node = (Node *) ptr;
assert(fwrite(node, sizeof(Node), 1, fpw) == 1);
    free(node);
}

fpw具有全局范围。

当我尝试调试时,我发现fwrite返回0,perror提供“坏地址”作为错误。

如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2011-11-02 06:19:35

我不确定我在这里是否有答案,但我认为值得指出的是,我在您的代码中看到了一些事情。我希望解决这些问题能帮助你克服你的问题。

  1. 当您有一个要转储到文件中的类时--让这个类为您做工作。这意味着,您的Node类将有一个write/read集,或者是operator<</operator>>或您将要调用的任何其他常规例程集,并让它将自己序列化为一个文件,然后在读取时从文件中反序列化自己。Boost还为您提供了工具来帮助解决这个问题。
  2. 转储类指针的内容是一件危险的事情,如果您在一个体系结构上转储,而在另一个体系结构上阅读(在您的例子中是32LEvs64BE),尤其是。它肯定会会以各种各样不可预测的方式失败。
  3. 您访问从某个地方得到的指针,而不验证它的有效性。我不知道在调用ptr之前是否对push进行了测试,但我确信检查push本身中的指针是有帮助的,特别是如果错误表明它可能不好。
  4. 你在写C++代码。你在毁了一堂课。free不应该在代码中的任何位置!你要用Node* node创建malloc吗?我希望不会!如果您使用的是new,则必须使用delete
  5. 您正在释放ab在您的~Node中,但是您没有将它们分配到任何地方。如果您没有在构造函数中分配它-当您在析构函数中删除它时-验证您分配了它们,否则您也会在这里得到一堆未定义的行为。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7976168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档