- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
struct message {
uint8_t start;
uint16_t length;
uint8_t data[10];
uint8_t checkSum;
} __attribute__((packed));
struct message devices[10];
void request(struct message *msg) {
struct request *req = (struct request *)&msg->data;
req->operation = 1;
req->requesterAddress = MASTER_ADDRESS;
}
request(&devices[0]);
我的问题是,为什么“&msg->data”处有“&”符号?
我的理解是函数“request”接收一个指向结构的指针“msg”。 msg->data 从“msg”指向的结构中检索指针“data”(“data”是一个数组),然后将其转换为另一个指针类型(struct request *)。
所以该部分应该是 (struct request *)msg->data;那么为什么要使用&符号呢?
最佳答案
嗯,这段代码不是 C 语言,因为 __attribute__((packed))
仅在 gcc 和其他一些特定实现中有效,但在标准 C 中绝对不存在。
但提供sizeof(struct message) <= 10
,其余代码是根据 4. Conformance
的正确代码但包含未指定的行为,并且可能包含未定义的行为,具体取决于实现
request(&devices[0]);
和void request(struct message *msg) {...}
:好的:request
预计 struct message *
并接收 struct message
数组的第一个元素的地址- 这里一切都很好struct request *req = (struct request *)&msg->data;
: 这是最有趣的部分。
msg->data
是一个char数组,即一个聚合。聚合的地址是其第一个字节的地址。不同的说法(char *) &msg-> data
(聚合的第一个字节的地址)与 msg->data
相同(数组衰减为指向其第一个元素的指针)(struct request *)&msg->data;
指向 char 的指针被转换为指向 struct request
的指针。根据实现的不同,没有任何东西可以保证指针正确对齐。如果不是,则根据 6.3.2.3 指针第 7 节,这是未定义的行为。如果是,根据 6.5 表达式第 6-7 节,我们仍然具有未指定的行为,因为新指针将用于存储尚未定义的元素。 char[10]
的声明类型。但这将被所有已知的实现所接受,因为它们在内部处理相同的 char 数组(显式类型)和分配的内存(没有声明的类型) - 仅仅因为它们需要实现 malloc
(参见Is it possible to write a conformant implementation of malloc in C?)其余代码没有其他问题。但需要注意的是,如果__attribute__(packed)
荣幸地实现,现场data
将是结构体的第三个字节,这给出了奇怪的对齐方式。这可能会导致需要对某些类型进行严格对齐的实现崩溃。
来自 C99 n1256 草案的引用
- Conformance
...
2 If a ‘‘shall’’ or ‘‘shall not’’ requirement that appears outside of a constraint is violated, the behavior is undefined...
3 A program that is correct in all other aspects, operating on correct data, containing unspecified behavior shall be a correct program...
6.3.2.3 Pointers
...
7 A pointer to an object or incomplete type may be converted to a pointer to a different object or incomplete type. If the resulting pointer is not correctly aligned for the pointed-to type, the behavior is undefined. Otherwise, when converted back again, the result shall compare equal to the original pointer. When a pointer to an object is converted to a pointer to a character type, the result points to the lowest addressed byte of the object.
6.5 Expressions
...
6 The effective type of an object for an access to its stored value is the declared type of the object, if any. If a value is stored into an object having no declared type through an lvalue having a type that is not a character type, then the type of the lvalue becomes the effective type of the object for that access and for subsequent accesses that do not modify the stored value. If a value is copied into an object having no declared type using memcpy or memmove, or is copied as an array of character type, then the effective type of the modified object for that access and for subsequent accesses that do not modify the value is the effective type of the object from which the value is copied, if it has one. For all other accesses to an object having no declared type, the effective type of the object is simply the type of the lvalue used for the access.
7 An object shall have its stored value accessed only by an lvalue expression that has one of the following types:
- atype compatible with the effective type of the object,
- aqualified version of a type compatible with the effective type of the object,
- a type that is the signed or unsigned type corresponding to the effective type of the object,
- a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,
- an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or
- a character type.
关于c - 从结构体访问数组并将其转换为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43332618/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!