为什么我不能在没有获取int的地址的情况下将一个int存入char []?

时间:2014-10-21 11:37:57

标签: c pointers char int memcpy

这可能是重复的,但我还没有找到任何其他问题来处理我的确切情况(还)。

这是我想要做的事情:

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 []?

2 个答案:

答案 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不是函数,它不需要使用括号。