我希望将表达式(这是一个int)的结果设置为int指针。如果我执行以下操作:
int* a = new int;
memcpy(a, (int*)(3+4), sizeof(int));
我无法绕过它的预期行为。它会将值7复制到预期的a中。或者它会导致一些未定义的行为
答案 0 :(得分:3)
不,这不会复制那里的值7。相反,你会得到未定义的行为。
考虑将memcpy(dest, source, size)
写为“请转到source
指定的内存地址并从中复制size
个字节。如果你写(int *)(3 + 4)
,你会得到一个数字值为7的指针,这意味着它指向内存地址7.正如你不希望一个街区上的137号房子被名为先生和夫人的人居住。137,你不应该期望内存地址7的内容是数值7。
实际上,内存地址7甚至不太可能是您可以读取或写入的存储。你基本上用类型转换“组成”了一个地址,并且没有理由相信那里有任何有意义的东西。想象一下,在一封信上写下一个虚假的邮寄地址,然后将其放入邮件中。它实际上到达任何人的可能性很小,如果确实达到了它们,他们就不知道你为什么要联系他们。
从语言的角度来看,这是未定义的行为,在大多数系统上它都是段错误的。