- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此代码片段打印值 5
。我不明白为什么。
#include <stdio.h>
struct A
{
int x;
};
struct B
{
struct A a;
int y;
};
void printA(struct A *a)
{
printf("A obj: %d\n", a->x);
}
int main(void)
{
struct B b = {
{
5
},
10
};
struct A *a = (struct A*)&b;
printA(a);
printf("Done.\n");
return 0;
}
当我创建 b
时,指向它的指针将指向数据 { {5}, 10 }
。
当我将 &b
转换为 struct A*
时,我向编译器保证这个 struct A*
指向一个结构数据类型 int
的单个数据元素。相反,我为它提供了一个指向数据类型为 struct A
、int
的两个数据元素的结构的指针。
即使第二个变量被忽略(因为 struct A
只有一个数据成员)我仍然为它提供一个结构,其成员的数据类型为 struct A
,不是 int
。
因此,当我将 a
传递给 printA
时,将执行 a->x
行,本质上是要求访问第一个数据a
的元素。 a
的第一个数据元素是数据类型 struct A
,这是一个类型不匹配,因为 %d
需要一个数字,而不是一个结构 A
。
这里到底发生了什么?
最佳答案
When I create
b
, a pointer to it would point to the data{ {5}, 10 }
.
是的,从某种意义上说,它是类型适当且值正确的 C 初始值设定项的文本。该文本本身不应按字面意义作为结构的值。
When I cast
&b
tostruct A*
, I'm assuring the compiler that thisstruct A*
points to a struct of a single data element of data type int.
不,不完全是。您正在转换表达式&b
的值以键入struct A *
。结果指针是否实际指向 struct A
是一个单独的问题。
Instead, I'm providing it a pointer to a struct of two data elements of data types
struct A
,int
.
不,不是“代替”。鉴于 struct B
的第一个成员是 struct A
,并且 C 禁止在结构的第一个成员之前填充,指向 struct B< 的指针
也 指向一个struct A
——一般意义上的B 的第一个成员。正如@EricPostpischi 在评论中观察到的那样,C 标准在您的特定情况下明确指定了结果:给定 struct B b
,将指向 b
的指针转换为类型 struct A *
产生一个指向 b
的第一个成员的指针,一个 struct A
。
Even if the second variable is ignored (since
struct A
has only one data member) I am still providing it a struct whose member is of data typestruct A
, notint
.
struct B
表示的第一个 sizeof(struct A)
字节构成了它的第一个成员 struct A
的表示.后者是前者的一员,除了内存中的重叠外,没有任何物理表现。
即使语言没有明确指定它,鉴于您将变量 b
声明为 struct B
,也没有实际理由期望表达式 (struct A*)&b == &b.a
的计算结果为 false,毫无疑问,右侧指针可用于访问 struct A
。
Thus, when I pass in a to
printA
, the linea->x
is performed, essentially asking to access the first data element ofa
.
是的,这就是断言 a
确实指向 struct A
的地方。正如已经讨论过的,它在你的情况下是做什么的。
The first data element of
a
is of data typestruct A
,
没有。 *a
根据定义是 struct A
。具体来说,它是 struct A
,其表示与 b
的表示的开头重叠。如果没有这样的struct A
,那么行为将是未定义的,但这不是问题。与每个 struct A
一样,它有一个由 x
指定的成员,即 int
。
which is a type mismatch due to the
%d
expecting a digit, not astruct A
.
你的意思是期待一个int
。这就是它得到的。这就是表达式 a->x
读取的内容,假设行为已定义,因为那是该表达式的类型。在不同的情况下,行为可能确实未定义,但在任何情况下该表达式都不会提供 struct A
。
What exactly is happening here?
似乎正在发生的事情是,您正在想象与 C 实际提供的不同的、更高级别的语义。特别是,您似乎将结构作为可区分成员对象列表的心理模型,这导致您形成不正确的期望。
也许您更熟悉弱类型语言(如 Perl)或动态类型语言(如 Python),但 C 的工作方式不同。您不能查看 C 对象并有用地问“您的类型是什么”?相反,您通过用于访问它的表达式的静态类型的镜头来查看每个对象。
关于将结构指针转换为另一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51757117/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!