我试图向同事解释一个概念,然后意识到我的理解是错误的。
如何嵌入数组的结构可分配?
例如:
typedef struct {
uint8_t data[8];
} Test;
...
Test test1;
Test test2;
... some assignment to test1
test2 = test1;
我知道数据是否是我们需要实现深层复制的类型指针,但我试图完全理解它的工作方式。
我的过程就是'数据'通常是指向第一个元素的指针,而&数据将是该指针的地址。在struct的情况下是编译器用来访问数组的结构地址吗?
有人可以解释允许这种情况的语言机制。这只是c结构的语法糖吗?如果是这样,为什么不实现这样的直接数组赋值......
uint8_t data[10];
uint8_t data2[10];
...
data2 = data;
为什么经过多年的C编程,我对我使用但从未理解的机制存在存在的语言危机?
答案 0 :(得分:7)
为什么经过多年的C编程,我对我使用但从未理解的机制存在存在的语言危机?
你总是误解了数组,现在这已经揭晓了它:)
实际规则如下:
数组与指针不同;没有"暗示指针"或阵列中的任何东西。内存中的数组存储完全由具有数组内容的单元格组成,仅此而已。
在表达式中使用数组的标识符时,该表达式的值是指向数组第一个元素的(临时)指针。 (为了简洁,我省略了一些例外情况。)
2a上。 (如果不清楚)表达式具有值,表达式的值不需要存储。例如,在代码f(1 + 1)
中,值2
是一个值,但它不在对象中,从概念上讲,它不存储在任何地方。上面提到的指针是相同的值。
你不能写的原因:
data2 = data;
是因为规则2启动,右侧的值是指针,并且在数组和指针之间没有定义赋值操作。 (它不知道要复制多少单位。)
语言设计者可以为规则2添加另一个例外,这样如果数组是=
的唯一右手操作数,那么值转换就不会发生,并且数组按值分配。这将是一个一致的规则,语言将起作用。但他们没有。
结构分配不会触发规则2,因此可以很好地复制数组。
事实上,他们可以完全废除规则2,语言仍然有效。但是,您需要编写puts(&s[0]);
而不是puts(s);
,依此类推。在设计C(包含我认为有类似规则的BCPL)时,他们选择包括规则2,大概是因为当时的好处似乎超过了负面因素。
答案 1 :(得分:3)
从一个结构体到另一个结构体的分配会对结构体成员进行逐元素复制。我认为你的问题在于过度思考“逐元素复制”操作的概念。如果你试图在每个单独的元素上使用赋值运算符来做自己的副本,那么你确实会遇到无法复制数组的问题。但是,当您执行直接结构赋值时,编译器会知道要发出什么代码来正确处理内部数组。除了在每个成员上使用赋值运算符之外,它不仅仅是语法糖。
答案 2 :(得分:0)
包含固定长度数组的结构的结构名称被视为连续对象,因此可以赋值,而数组名称则被解释为第一个元素的地址,除非它是操作数router.post('/testpage/*', function (req, res) {
运算符和一元sizeof
运算符。