Tag: 严格别名

何时char *对于严格的指针别名是安全的?

我一直在尝试理解严格的别名规则,因为它们适用于char指针。 这是陈述: 始终假定char *可以引用任何对象的别名。 好的,在套接字代码的上下文中,我可以这样做: struct SocketMsg { int a; int b; }; int main(int argc, char** argv) { // Some code… SocketMsg msgToSend; msgToSend.a = 0; msgToSend.b = 1; send(socket, (char*)(&msgToSend), sizeof(msgToSend); }; 但接下来是这个声明 相反的情况并非如此。 将char *转换为除char *之外的任何类型的指针并取消引用它通常违反严格别名规则。 这是否意味着当我收回一个char数组时,当我知道消息的结构时,我无法重新解释转换为结构: struct SocketMsgToRecv { int a; int b; }; int main() { SocketMsgToRecv* pointerToMsg; char msgBuff[100]; […]

memset编写的对象的有效类型是什么?

代码1: unsigned int *p = malloc(sizeof *p); memset(p, 0x55, sizeof *p); unsigned int u = *p; 代码2: void *d = malloc(50); *(double *)d = 1.23; memset(d, 0x55, 50); unsigned int u = *(unsigned int *)d; 在每种情况下, memset对malloc空间中对象的有效类型有什么影响; 那么初始化u正确的还是严格的别名违规? 有效类型的定义(C11 6.5 / 6)是: 用于访问其存储值的对象的有效类型是对象的声明类型(如果有)。 如果通过具有非字符类型的类型的左值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该值的后续访问的有效类型储值。 如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是复制值的对象的有效类型(如果有)。 对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型。 然而,目前还不清楚memset行为是否像通过字符类型的左值或其他东西写作一样。 memset (7.24.6.1)的描述并不是很有启发性: memset函数将c的值(转换为unsigned char )复制到s指向的对象的前n个字符中。