这可能是重复的,但我还没有找到任何其他问题来处理我的确切情况(还)。
这是我想要做的事情:
int n = 12;
char s[sizeof(n)];
memcpy(s, (char *)n, sizeof(n));
printf("%d", s);
基本上,我想将n
复制到s
,而不必获取n
的地址。当我运行它时,它给了我一个分段错误。然而,这有效:
printf("%d", (char *)n);
所以我知道问题出在memcpy调用中。为什么我不能像这样将一个int存入char []?
答案 0 :(得分:2)
您遇到分段错误,因为您尝试执行的操作不是您的代码所声明的内容。
int n = 12;
char s[sizeof(n)];
memcpy(s, (char *)n, sizeof(n));
你想要说:
“将代表
sizeof(int)
的值的n
字节复制到s
”。
但是memcpy()
是关于复制内存对象而不是值。对象驻留在给定地址,包含给定值。取n
后会得到值,&n
会给出地址。
构造(char *)n
告诉编译器将n
的值解释为char
的地址,所以您 所说的是:
“将
sizeof(int)
中包含的n
字节复制到s
。”
自n = 12
以来,您正在阅读地址0x00000012
...这很可能不是一个可以读取的合法地址(因此是段错误)。
在将 (而不是值)转换为 “将n
之前,取char *
的地址,您的陈述符合您的意图:< / p>
int n = 12;
char s[sizeof(n)];
memcpy(s, (char *)&n, sizeof(n));
sizeof(int)
地址的n
字节复制到s
”。
答案 1 :(得分:1)
您不需要取s
的地址,因为此上下文中数组的名称求值为第一个元素的地址。由于整数n
不是数组,因此不适用,这就是您必须获取地址的原因。
当然你也可以使用一个int
数组来解决这个问题,但这是非常愚蠢的,一般来说是一个非常糟糕的主意:
int n[1];
char s[sizeof n];
memcpy(s, n, sizeof n);
这是有效的,因为n
现在求值为&n[0]
,即数组中第一个(也是唯一的!)元素的地址。
请注意,sizeof
不是函数,它不需要使用括号。