为什么我不能在不获取 int 地址的情况下将 int memcpy 到 char[] ?

Aja*_*har 0 c int pointers char memcpy

这可能是重复的,但我还没有找到任何其他涉及我的具体情况的问题。

这就是我想做的:

int n = 12;
char s[sizeof(n)];
memcpy(s, (char *)n, sizeof(n));
printf("%d", s);
Run Code Online (Sandbox Code Playgroud)

基本上,我想复制ns而不需要获取 的地址n。当我运行它时,它给了我一个分段错误。然而,这有效:

printf("%d", (char *)n);
Run Code Online (Sandbox Code Playgroud)

所以我知道问题出在 memcpy 调用上。为什么我不能像这样将 int 复制到 char[] 中?

Dev*_*lar 5

您会遇到分段错误,因为您尝试执行的操作不是代码所述的操作。

int n = 12;
char s[sizeof(n)];
memcpy(s, (char *)n, sizeof(n));
Run Code Online (Sandbox Code Playgroud)

想说

“将sizeof(int)表示 值的字节复制ns”。

memcpy()涉及的是复制内存对象,而不是值。对象驻留在给定地址,并包含给定值。取值n给出值,取值&n给出地址。

该构造告诉编译器将 a的(char *)n解释为a 的地址,所以您所说的是:nchar

“将包含在地址中的sizeof(int)字节复制到 中。”ns

因为n = 12,您正在从地址读取0x00000012...这很可能不是一个合法的读取地址(因此出现段错误)。

通过在将其(而不是)转换为n之前获取地址,您的语句符合您的意图:char *

int n = 12;
char s[sizeof(n)];
memcpy(s, (char *)&n, sizeof(n));
Run Code Online (Sandbox Code Playgroud)

“将地址处的sizeof(int)字节复制到”。ns