为什么结构分配可与结构中的数组一起使用

变得更聪明

我试图向一个同事解释一个概念,然后意识到我理解不正确。

嵌入数组的结构如何可分配?

例如:

typedef struct {
    uint8_t data[8];
} Test;
...
Test test1;
Test test2;
... some assignment to test1
test2 = test1;

我知道数据是否为指针类型,我们需要实现深层复制,但我试图充分理解其工作方式。

我的处理过程是,因为“数据”通常是指向第一个元素的指针,而&data将是该指针的地址。就struct而言,是编译器用来访问数组的struct地址吗?

有人可以解释允许这种情况的语言机制。这只是用于语法结构的语法糖吗?如果是这样,为什么不像这样实现直接数组分配...

uint8_t data[10];
uint8_t data2[10];
...
data2 = data;

为什么经过多年的C编程后,我对于使用过但从未理解的一种机制存在生存语言危机?

MM

为什么经过多年的C编程后,我对于使用过但从未理解的一种机制存在生存语言危机?

您总是会误解数组,现在这使它暴露了:)

实际规则是:

  1. 数组与指针不同。数组中没有“隐式指针”或任何东西。数组在内存中的存储完全由具有数组内容的单元组成,仅此而已。

  2. 在表达式中使用数组的标识符时,该表达式的值是指向数组第一个元素的(临时)指针。(为简洁起见,我省略了一些例外)。

    2a。(如果不清楚),表达式具有value,并且表达式的值不需要存储。例如,在代码中f(1 + 1),值2是一个值,但它不在对象中,并且从概念上讲,它不存储在任何地方。上面提到的指针是同一种值。

你不能写的原因:

data2 = data;

这是因为规则2插入了,右侧的值是一个指针,并且未在数组和指针之间定义赋值操作。(它不知道要复制多少单位)。

语言设计者可以在规则2中添加另一个例外,以便如果数组是唯一的右手操作数,=则不会发生值转换,而是按值分配数组。那将是一个一致的规则,并且该语言将有效。但是他们没有。

结构分配不会触发规则2,因此可以愉快地复制数组。

实际上,他们本可以完全取消规则2,并且该语言仍然有效。但是,那么您将需要编写puts(&s[0]);而不是puts(s);诸如此类。在设计C(并入BCPL,我认为也有类似的规则)时,他们选择加入规则2,大概是因为当时的好处似乎大于缺点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将结构化数组转换为numpy数组以与Scikit-Learn一起使用

将bsearch与结构内的数组一起使用

在MGO驱动程序中更新查询,可与bson.M一起使用,但不适用于定制结构

为什么这种结构分配数组不能编译?

将结构体(字节)与SWIFT一起使用-结构体为NSData,而NSData为结构

如何定义与结构数组C一起使用的宏

为什么MATLAB对结构数组分配中的字段顺序敏感?

GET请求可与Postman一起使用,但为什么不能与ReactJS fetch一起使用?

如何在C#Unity中将C结构与2D数组一起使用

如何将numpy.savetxt与包含数组的结构化数组一起使用

使用键值对和类似“%LIKE%”结构的sql一起搜索php多维关联数组

为什么将Dagger与Android体系结构组件一起使用

为什么我不能将指定的初始化器与非聚合结构一起使用?

在C中将bsearch()函数与结构数组一起使用

如何将Numba“ @vectorize” ufunc与结构化的Numpy数组一起使用?

为什么我可以使用数组结构分解而不是对象结构分解为引用分配值?

为什么sort与多维数组一起使用?

为什么eval()无法与数组一起使用

将malloc与结构一起使用

在c中,将if语句与结构项一起使用

将malloc与函数中的结构一起使用

为什么我的HTML结构不能与CSS Grid布局一起使用?

如果将其与结构对象一起使用,是否可以初始化数组?| C#

为什么isblank返回的数组不能与Excel中的match函数一起使用?

在 c 中将 fseek 与结构数组一起使用

将 UILocalizedIndexedCollation.section(for: collationStringSelector:) 与结构数组一起使用

在 Swift 中,为什么我看到 CodingKey 协议与枚举一起使用以在结构上使用 Codable 协议?

为什么我的结构中的 char 数组即使分配结构也是空的?

如何使用存储在结构数组中的 Bool 与 DisclosureGroup 中的 isExpanded 一起使用