c - 在二进制文件中使用 2 字节字符数组写入不寻常的额外 2 字节
问题描述
我正在为一个旧赋值编写一个生成器,它按顺序生成一个二叉树并将其打印到一个二进制文件中,然后我可以在 bash 中使用 od 检查节点是否正确写入。我注意到,当写入携带节点值的 2 char 数组时,与预期的最多 2 个字节相比,它最终占用了 4 个字节。不仅如此,而且每次写入第三个节点时,额外的 2 个字节都是用 0xFFFF 填充的负数。当我从 Node 结构和所有相关代码中删除 char 数组时,无论那些额外的字节都完全消失了。通过在回读时忽略文件的那一部分,我能够很好地完成作业,但我仍然很难理解为什么它首先被写入。我将包含我的代码和“od -x”的输出
int32_t loc;
char value[2];
int32_t left;
int32_t right;
}Node;
char getRandUpper() {
return (char)('A' + (rand() % 26));
}
int main(int argc, char* argv[]) {
srand((unsigned int)time(NULL));
int numOfNodes = atoi(argv[2]);
char* fileName = argv[1];
FILE* filePtr = fopen(fileName, "wb");
Node biTree[numOfNodes];
for(int i = 0; i < numOfNodes; i++) {
biTree[i].loc = i;
if((i * 2) >= numOfNodes) {
biTree[i].left = -1;
biTree[i].right = -1;
} else {
biTree[i].left = (2 * i) + 1;
biTree[i].right = (2 * i) + 2;
}
for(int j = 0; j < 2; j ++) {
biTree[i].value[j] = getRandUpper();
printf("%c", biTree[i].value[j]);
printf("size of char array: %ld bytes\n", sizeof(biTree[i].value));
}
}
fwrite(biTree, sizeof(Node), numOfNodes, filePtr);
fclose(filePtr);
return 0;
}
这是 od 的输出:
0000020 0001 0000 484f 0000 0003 0000 0004 0000
0000040 0002 0000 4652 ffff 0005 0000 0006 0000
0000060 0003 0000 4657 0000 0007 0000 0008 0000
0000100 0004 0000 4557 0000 0009 0000 000a 0000
0000120 0005 0000 4152 0000 ffff ffff ffff ffff
0000140 0006 0000 4a41 0000 ffff ffff ffff ffff
0000160 0007 0000 414a 0000 ffff ffff ffff ffff
0000200 0008 0000 4c41 0000 ffff ffff ffff ffff
0000220 0009 0000 504e 0000 ffff ffff ffff ffff
0000240
任何能为我自己揭开神秘面纱的事情都会受到赞赏。这可能只是我的愚蠢,但谁知道呢。
解决方案
推荐阅读
- powerbi - Power BI 筛选列的 MAX
- jquery - 覆盖 jQuery 插件的 init 函数
- python - 如何从数据框中修改子类的自身数据?
- ruby-on-rails - 在 textarea 表单字段中编辑 JSONB 数据
- python - 如何在 Python 中避免区分大小写
- android - getSupportActionBar() 在片段中不支持
- python - matplotlib 动画在运行后立即关闭
- javascript - 循环并打印出(在 html 上)具有函数的对象数组
- javascript - Vue.js $emit 来自父级的事件并在组件(子级)上接收它
- hyper-v - Hyper-V 无法启用服务器之间的复制,错误为 0x00002EE2