【发布时间】:2019-01-17 20:43:07
【问题描述】:
有了这个定义:
struct vector {
const float x;
const float y;
};
下面的代码 sn-p 是否会导致未定义的行为?
struct vector src = {.x=1.0, .y=1.0};
struct vector dst;
void *dstPtr = &dst;
memcpy(dstPtr, &src, sizeof dst);
gcc 和 clang 不会发出任何警告,但会导致修改 const 限定类型。
该构造看起来很像How to initialize const members of structs on the heap 的已接受答案中给出的构造,显然是一致的。我不明白我的例子怎么会不符合标准。
【问题讨论】:
-
查看OP的最后一个问题:stackoverflow.com/questions/54242966/…
-
具有
const成员的struct不能由assignment设置,只能由initialization设置(你为src做的)。memcpy类似于赋值。从struct中删除const,一切都会好起来的。 IMO,结构成员上的const并不是那么有用,因为您遇到了这个问题。请注意,即使使用const,memcpy也不会造成任何伤害,但这是不好的做法。 -
@CraigEstey 它可能会造成伤害。考虑代码 -
{struct vector foo={...}; float a = foo.x ;memcpy(&foo, ..., sizeof(foo)); int b = foo.x;}。编译器可以重用a的值来设置b。 -
似乎是个好问题,不知道为什么有人反对它(尽管最后一段是不必要的)
-
我不明白为什么这个问题被否决了;这是一个合理且表述清楚的问题,我认为这不是直截了当的答案。
标签: c struct constants language-lawyer