关于使用 memcpy 将表达式值复制到指针的查询
Query regarding copying expression value to pointer using memcpy
我希望将一个表达式(一个 int)的结果设置为一个 int 指针。如果我执行以下操作:
int* a = new int;
memcpy(a, (int*)(3+4), sizeof(int));
我无法理解它的预期行为。它将按预期将值 7 复制到 a 中。或者它会导致一些未定义的行为
不,这不会复制其中的值 7。相反,您会得到未定义的行为。
把memcpy(dest, source, size)
写成“请转到source
指定的内存地址并从中复制size
字节。如果你写 (int *)(3 + 4)
,你会得到一个数值为 7 的指针,这意味着它指向内存地址 7。就像你不会期望一个街区的 137 号房子住着名叫 Mr. 和 Mrs. 的人一样. 137、你不要指望内存地址7的内容是数值7.
事实上,内存地址 7 甚至不可能是您可以读取或写入的存储空间。你基本上是用类型转换“编造”了一个地址,没有理由相信那里有任何有意义的东西。想象一下,在一封信上写下一个虚假的邮寄地址并将其投递到邮件中。它实际上到达任何人的可能性很小,如果它确实到达了他们,他们将不知道您为什么要联系他们。
从语言的角度来看,这是未定义的行为,在大多数系统上它会出现段错误。
我希望将一个表达式(一个 int)的结果设置为一个 int 指针。如果我执行以下操作:
int* a = new int;
memcpy(a, (int*)(3+4), sizeof(int));
我无法理解它的预期行为。它将按预期将值 7 复制到 a 中。或者它会导致一些未定义的行为
不,这不会复制其中的值 7。相反,您会得到未定义的行为。
把memcpy(dest, source, size)
写成“请转到source
指定的内存地址并从中复制size
字节。如果你写 (int *)(3 + 4)
,你会得到一个数值为 7 的指针,这意味着它指向内存地址 7。就像你不会期望一个街区的 137 号房子住着名叫 Mr. 和 Mrs. 的人一样. 137、你不要指望内存地址7的内容是数值7.
事实上,内存地址 7 甚至不可能是您可以读取或写入的存储空间。你基本上是用类型转换“编造”了一个地址,没有理由相信那里有任何有意义的东西。想象一下,在一封信上写下一个虚假的邮寄地址并将其投递到邮件中。它实际上到达任何人的可能性很小,如果它确实到达了他们,他们将不知道您为什么要联系他们。
从语言的角度来看,这是未定义的行为,在大多数系统上它会出现段错误。