fwrite 失败(返回 0,错误给出 "Bad address")
fwrite fails (returns 0, perror gives "Bad address")
出现这种错误的可能原因是什么?写入文件的创建没有问题,但是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
给出"坏地址"作为错误。
我不确定我在这里能给你一个答案,但我认为值得指出我在你的代码中看到的一些东西。我希望解决这些问题能帮助你克服你的问题。
-
当你有一个类,你想转储到一个文件-让类为你做的工作。这意味着,您的
Node
类将具有write
/read
集,或operator<<
/operator>>
或您将调用的任何其他常规例程集,并让它将自身序列化到文件中,然后在读取时从文件中反序列化自己。Boost也提供了一些工具来帮助你完成这些。 -
转储类指针的内容是一件危险的事情,特别是,如果您在一个体系结构上转储,并在另一个体系结构上读取(在您的情况下32LE vs 64BE)。肯定会以各种不可预测的方式失败。
-
您访问从某处获得的指针而不验证其有效性。我不知道在你调用
push
之前是否对你的ptr
进行了测试,但我确信检查push
本身的指针是有帮助的,特别是如果错误表明它可能不好。 -
你在写c++代码。你在毁掉一个班级。
free
不应该出现在你的代码中!你正在用malloc
创建Node* node
?我希望不会!如果你正在使用new
,那么必须使用delete
。 -
你在
~Node
中释放a
和b
,但你没有在任何地方分配它们。如果你没有在构造函数中分配它——当你在析构函数中删除它时——验证你已经分配了它们,否则你也会在这里得到一堆未定义的行为。
只是一些忍不住注意到的事情,希望能有所帮助。
- 赛通"Cannot take address of memoryview slice"
- C++:寻找"returning address of local variable..."的更正
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- 为什么打印 c 样式字符串的'address of index n'会导致子字符串的输出
- 隐式转换产生"error: taking address of temporary"(GCC 与 clang)
- -fsanitize=Address with clang++ 与 g++ 的不同输出
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 向量数组"Cannot access memory at address"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- MEX 文件可以使用 -fsanitize=address 运行吗?
- 为什么我的重载 + 运算符在返回时会产生"Invalid address specified to RtlValidateHeap"错误?
- 如何修复警告"the compiler can assume that the address of 'object' will never be NULL"
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- 在无效地址上,boost::asio::ip:::address::from_string 没有引发异常
- 'Bad address' 当对 recvfrom 检索到的 sockaddr* 进行发送调用时
- fwrite 失败(返回 0,错误给出 "Bad address")