假设我有以下代码:
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。
为什么两条
线的工作原理完全相同?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
不会发生腐烂。