为什么 memcpy 到缓冲区和指向缓冲区的指针的工作原理相同?

问题描述 投票:0回答:1

假设我有以下代码:

char buff[100] = {0};
char msg[] = "hello!";

memcpy(buff, msg, sizeof(msg));

OR

memcpy(&buff, msg, sizeof(msg));

为什么两条 memcpy 行的工作原理完全相同?

我预计当使用 &buff 时,它会将 msg 复制到存储 buff 衰减到的指针本身的内存中,而不是该指针实际指向的内存。

当我想象这样的指针时:

&buff->buff->buff[0]

我可以合理解释为什么他们的行为相同。但当我想象实际的记忆是这样的:

address        | value   | (name)
--------------  --------- ----------------
0x1000         | 'h'     | (buff[0])
0x1001         | 'e'     | (buff[1])
... etc
__________________________________________

0x5000-0x5008  | 0x1000  | (buf - char *)
__________________________________________

0x8000-0x8008  | 0x5000  | (&buf - char**)
__________________________________________

现在我不明白为什么消息不写入地址 0x5000,而是覆盖值 0x1000。

c string pointers buffer memcpy
1个回答
0
投票

为什么两条

memcpy
线的工作原理完全相同?

数组的地址和数组第一个元素的地址指向同一个位置。


memcpy(buff, msg, sizeof(msg));
类似于
memcpy(&buff[0], msg, sizeof(msg));
,因为数组
buff
在此用法中转换为类型和指向数组第一个元素的指针。然后指向数组第一个元素的指针将转换为
void *

所以我们真的是在比较

(void *) &buff[0]
(void *) &buff


我预计当使用

&buff
时,它会将
msg
复制到存储
buff
衰减到的指针本身的内存中,

不。

&buff
是一个指针,它的被传递到
memcpy()
&buff 不会发生
腐烂

© www.soinside.com 2019 - 2024. All rights reserved.