- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看 Barnyard2 的 sf_ip.h source code .我不理解 sfip_t 结构,尤其是 union block 。
typedef struct _ip {
int family;
int bits;
/* see sfip_size(): these address bytes
* must be the last field in this struct */
union
{
u_int8_t u6_addr8[16];
u_int16_t u6_addr16[8];
u_int32_t u6_addr32[4];
// u_int64_t u6_addr64[2];
} ip;
#define ip8 ip.u6_addr8
#define ip16 ip.u6_addr16
#define ip32 ip.u6_addr32
// #define ip64 ip.u6_addr64
} sfip_t;
为什么要用数组?我试图寻找文档,但谷歌一直没有运气。谁能解释一下这里正在做什么?
最佳答案
C 中的 union 为其所有元素使用相同 内存块。这与结构不同,后者的元素在内存中是连续的。
所以,虽然 struct {int x;如果您的变量从内存位置
将这样布局:0x40000000
开始,则 int y;}
+-------------+
0x40000000 | x (4 bytes) |
+-------------+
0x40000004 | y (4 bytes) |
+-------------+
一个相关的 union {int x; int y;}
是这样存在的:
Address
+-------------+-------------+
0x40000000 | x (4 bytes) | y (4 bytes) |
+-------------+-------------+
换句话说,它一次只能用于一个,从技术上讲,当您上次使用x 时使用
来设置变量 - 虽然在这种情况下,您很可能会发现它会起作用,因为这两种可能性是同一类型。y
是未定义的行为
在您的特定情况下,您具有以下内存布局(假设您的变量位于 0x40000000
):
+--------------+--------------+--------------+
0x40000000 | u6_addr8[ 0] | | |
+--------------+ u6_addr16[0] | |
0x40000001 | u6_addr8[ 1] | | |
+--------------+--------------+ u6_addr32[0] |
0x40000002 | u6_addr8[ 2] | | |
+--------------+ u6_addr16[1] | |
0x40000003 | u6_addr8[ 3] | | |
+--------------+--------------+--------------+
0x40000004 | u6_addr8[ 4] | | |
+--------------+ u6_addr16[2] | |
0x40000005 | u6_addr8[ 5] | | |
+--------------+--------------+ u6_addr32[1] |
0x40000006 | u6_addr8[ 6] | | |
+--------------+ u6_addr16[3] | |
0x40000007 | u6_addr8[ 7] | | |
+--------------+--------------+--------------+
0x40000008 | u6_addr8[ 8] | | |
+--------------+ u6_addr16[4] | |
0x40000009 | u6_addr8[ 9] | | |
+--------------+--------------+ u6_addr32[2] |
0x4000000a | u6_addr8[10] | | |
+--------------+ u6_addr16[5] | |
0x4000000b | u6_addr8[11] | | |
+--------------+--------------+--------------+
0x4000000c | u6_addr8[12] | | |
+--------------+ u6_addr16[6] | |
0x4000000d | u6_addr8[13] | | |
+--------------+--------------+ u6_addr32[3] |
0x4000000e | u6_addr8[14] | | |
+--------------+ u6_addr16[7] | |
0x4000000f | u6_addr8[15] | | |
+--------------+--------------+--------------+
假设您了解您的特定 C 实现如何布局各种类型,这提供了一种以不同方式引用相同数据的方法。
关于c - 看不懂struct Barnyard2的sf_ip头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15310326/
所以我今天在学习c。我编写了一些代码以使用 getchar() 获取输入并将其保存在变量中以了解整数输入的工作原理。 因此,如果用我的键盘输入“1”,然后按回车键,我会返回 4910 的值。我预计 4
我是一个非常沮丧的新手!我真的不知道从哪里开始。我有一个基于傻瓜书中的应用程序的应用程序。成功了。然后尝试将其转换为使用 WIMMOne 对话框来显示时间和日期。经过一系列错误的启动后,我加载了他们的
我们刚刚使用 bitbucket 建立了一个项目。我们将“生产”[P] 代码放在一个存储库中,然后我创建了它的一个分支 [m],然后我的同事 [C] 也创建了一个分支。 [P] /
我不明白我看到的错误,也不明白我应该在我的 ESLint 配置中更改什么来修复它,在深入研究了一段时间之后。 我有一段使用 ECMA 版本 6 (ES6) 的 JS 代码,如下所示: const la
我的代码有很多问题。编译时出现以下错误: “Ecommerce.DataHelpers.ProductNodeLoader”未实现接口(interface)成员“System.Collections.
我不明白这个语法是如何工作的,也找不到关于它的文档: word = '123xyz567' s = ''.join (c if c.isdigit() else ' 'for c in word) 第
不知道怎么解释,是在IE7中出现的,右边的DIV向右浮动,取消设置它的宽度,左边 float 的子DIV会变成和父DIV一样宽。 http://jsfiddle.net/dyvar/1/ IE 7 最
$newUser.addClass(newTweet.user).attr('data-user', newTweet.user).text('@' + newTweet.user + ': ');
我有一个带有输入框的 tkinter GUI,我只想允许数字。有人可以向我解释验证中每个命令/代码行的作用。我不明白 vcmd 变量和所有 '%i' '%s' 的东西。谢谢:) 更新:我有一个不同的应
我正在尝试使用 Richard Dawkin 的 Weasel Program 的 Python 版本这演示了随机选择与累积选择之间的差异,并且我的变异算法存在一些问题。我想也许我不明白如何使用Pyt
我正在学习嵌套,我的任务是让每一行都以缩进开头。这是我的代码,但它不起作用 $nestingDepth = 0 def logger description, &block puts "Beg
我正在编译 gcc 并阅读来自 https://gcc.gnu.org/install/configure.html 的手册 具体说明 --with-local-prefix=dirname Spec
我是一名优秀的程序员,十分优秀!