2017-10-21 217 views
0

我期待设置一个表达式的结果(这是一个int)转换成一个int指针。如果我按照以下步骤操作:关于复制表达值的查询的指针使用的memcpy

int* a = new int; 
memcpy(a, (int*)(3+4), sizeof(int)); 

我在绕行它的预期行为时遇到了麻烦。将它的值7复制到一个预期的。还是会导致一些不确定的行为

+2

这似乎不大可能,有一个在内存地址'7'有效的'int'值。 “(int *)(3 + 4)'是无稽之谈;此代码展示未定义的行为。使它成为'* a = 3 + 4;' –

+2

地址'0x0000007'在* system reserved *内存范围内下降。谁知道你会得到什么价值(除了分段错误)。你为什么将C++分配与'new'和C'memcopy'混合? –

回答

3

不,这不会在那里复制值7。相反,你会得到未定义的行为。

认为写作memcpy(dest, source, size)的意思是“请转到由source指定的存储器地址,并从中复制size个字节。如果你写(int *)(3 + 4),你会得到一个指针,其数值为七,意味着它指向的内存地址7.正如你不会指望一个块的房子137名为先生和夫人137人有人居住,你不应该期望的内存地址7的内容是数值7

事实上,内存地址7不可能甚至是存储您可以阅读或写字。你本质上是用类型转换“编造”了一个地址,没有理由相信这里有任何意义。想象一下,在信件上写下虚假的邮寄地址并将其放入邮件中。它实际上到达任何人的可能性都很小,如果它到达他们,他们不知道你为什么要联系他们。

从语言的角度来看,这是不确定的行为,并且在大多数系统,它会出现段错误。