【发布时间】:2014-05-01 04:41:07
【问题描述】:
假设我想读/写一个 tar 文件头。 考虑到标准 C(C89、C99 或 C11), char 数组在结构中是否有任何特殊处理,关于填充?编译器能否为这样的结构添加填充:
struct header {
char name[100];
char mode[8];
char uid[8];
char gid[8];
char size[12];
char mtime[12];
char chksum[8];
char typeflag;
char linkname[100];
char tail[255];
};
我也看到它在网络上的代码中使用过。只是 freading,将这个结构写入一个块中的文件,假设不会有任何填充。当然也假设CHAR_BITS == 8。
我在想这样的 C 代码太常见了,标准会处理这种情况,但我就是在里面找不到,也许我不是一个好律师。
编辑
根据 C 标准之一,接受的答案将给出一个严格的或最严格的可移植实现,这让我可以使用标准库字符串函数来处理这些字段。考虑CHAR_BITS 和所有。我认为需要为此读取 512 uint8_t 的数组,然后可能将它们一个一个转换为字符。有更简单的方法吗?
【问题讨论】:
-
当你可以成为一名程序员时,谁还想成为一名律师。 ;)
-
它很常见,无论如何它通常都是个坏主意。数据全部为
char是一种形式。做到这一点的一种保证安全的方法是逐个成员,在读者和作者方面。是的,这很痛苦,是的,您可能会通过使用特定于实现的指令来“打包”您的结构(在两侧)来作弊。 -
标准不保证对齐(编译器可以添加填充)。但是,您很难找到一个在所示结构中添加填充的编译器;没有明显的理由添加任何填充。如果要进行填充,它将在两个奇数长度字段之后 -
typeflag和tail。如果一台机器主要是面向字的(基本访问是偶数字节边界上的 16 位单元——我不知道有这样的当前机器),那么编译器可能会通过添加填充这些字段来获得更好的性能。 OTOH,即使对于这样的计算机,编译器也可能不会。
标签: c struct alignment standards