【发布时间】:2016-09-07 22:32:18
【问题描述】:
据我了解,以下代码在 C11 中表现出未定义的行为:
#include <string.h>
struct aaaa { char bbbb; int cccc; };
int main(void) {
unsigned char buffer[sizeof(struct aaaa)] = { 0 };
struct aaaa *pointer = &buffer[0];
return (*pointer).cccc;
}
根据N1570 第 6.5.3.2 节第 4 条,
如果已为指针分配了无效值,则一元
*运算符的行为未定义。
附有一个脚注,说明了这一点
一元
*操作符解除对指针的引用的无效值包括空指针、与指向的对象类型不恰当对齐的地址以及对象在其生命周期结束后的地址。
struct aaaa * 和 unsigned char * 不太可能具有相同的对齐方式,因此我们为 pointer 分配了无效值,因此使用 *pointer 会导致 UB。
但是,我可以复制结构吗?
#include <string.h>
struct aaaa { char bbbb; int cccc; };
int main(void) {
unsigned char buffer[sizeof(struct aaaa)] = { 0 };
struct aaaa target;
memcpy(&target, buffer, sizeof(struct aaaa));
return target.cccc;
}
在这里,我们将struct aaaa * 和unsigned char * 传递给memcpy。虽然这看起来和第一段代码一样糟糕,但我在 C11 中找不到任何规定该代码显示 UB 的措辞。 memcpy 的这种用法会导致未定义的行为吗?
【问题讨论】:
标签: c language-lawyer memcpy c11