使用memcpy从内存块中读取两个整数

时间:2012-04-16 22:25:24

标签: c memcpy

我正在尝试使用void *block从内存块(我的指针memcpy指向块的内容)中连续存储两个整数。第一个是使用以下内容阅读:

memcpy(&test, block, sizeof(int));

我尝试使用以下方法阅读第二篇:

memcpy(&test, block + sizeof(int), sizeof(int));

(当然我在程序的不同执行实例中有这些stataments,所以问题不在于覆盖测试)

但我没有得到正确的结果!我在这做错了什么?

4 个答案:

答案 0 :(得分:6)

这是非标准的:

void *block = ...; 
block + sizeof(int); // where does this point to?

如果你想做指针运算,首先强制转换为已知大小的类型(指针加法隐含地乘以基础类型的大小,sizeof(unsigned char)总是1):

void *block = ...;
(unsigned char *) block + sizeof(int);

或者使用更简单的版本,

void *block = ...;
(int *) block + 1;

所以最终的代码是:

int test;
void *block = ...;
memcpy(&test, block, sizeof(test));
// do something...?
memcpy(&test, (int *) block + 1, sizeof(test));

或更简单的版本,

int test[2];
void *block = ...;
memcpy(&test, block, sizeof(test));

请勿执行以下操作:

test = *(int *) block;

如果block未对齐,它将在某些系统(通常是SIGBUS)上崩溃。

答案 1 :(得分:1)

  

使用以下内容读取第一个:

memcpy(&test, block + sizeof(int), sizeof(int));
  

我尝试使用以下方法阅读第二篇:

memcpy(&test, block + sizeof(int), sizeof(int));

这是同一段代码......所以它会做同样的事情(假设你没有在调用之间修改testblock,你没有向我们展示过)。

您正在覆盖&test处的第一个值。假设test是一个指向int的指针,有足够的有效内存来保存其中两个...

int test[2];
memcpy(test, block, sizeof(test));

如果test只是int,那么......

int a, b;
memcpy(&a, block, sizeof(a));
memcpy(&b, (int*)block + 1, sizeof(b));

答案 2 :(得分:0)

您正在两次读取相同的内存位置!您可能需要以下内容:

int test;
memcpy(&test, (char *)block + 0*sizeof(int), sizeof(int));
printf("%d\n",test);
memcpy(&test, (char *)block + 1*sizeof(int), sizeof(int));
printf("%d\n",test);

请注意,这是(故意)非常冗长;更简洁的修正是:

int test[2];
memcpy(test, block, 2*sizeof(int));
printf("%d\n%d\n",test[0],test[1]);

答案 3 :(得分:-1)

您从同一地址读取两个整数。 这种方式也太冗长了。尝试:

int *a = (int *)block;

然后,您只需a[0]a[1]

即可获取它们