我试图向一个同事解释一个概念,然后意识到我理解不正确。
嵌入数组的结构如何可分配?
例如:
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编程后,我对于使用过但从未理解的一种机制存在生存语言危机?
为什么经过多年的C编程后,我对于使用过但从未理解的一种机制存在生存语言危机?
您总是会误解数组,现在这使它暴露了:)
实际规则是:
数组与指针不同。数组中没有“隐式指针”或任何东西。数组在内存中的存储完全由具有数组内容的单元组成,仅此而已。
在表达式中使用数组的标识符时,该表达式的值是指向数组第一个元素的(临时)指针。(为简洁起见,我省略了一些例外)。
2a。(如果不清楚),表达式具有value,并且表达式的值不需要存储。例如,在代码中f(1 + 1)
,值2
是一个值,但它不在对象中,并且从概念上讲,它不存储在任何地方。上面提到的指针是同一种值。
你不能写的原因:
data2 = data;
这是因为规则2插入了,右侧的值是一个指针,并且未在数组和指针之间定义赋值操作。(它不知道要复制多少单位)。
语言设计者可以在规则2中添加另一个例外,以便如果数组是唯一的右手操作数,=
则不会发生值转换,而是按值分配数组。那将是一个一致的规则,并且该语言将有效。但是他们没有。
结构分配不会触发规则2,因此可以愉快地复制数组。
实际上,他们本可以完全取消规则2,并且该语言仍然有效。但是,那么您将需要编写puts(&s[0]);
而不是puts(s);
诸如此类。在设计C(并入BCPL,我认为也有类似的规则)时,他们选择加入规则2,大概是因为当时的好处似乎大于缺点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句