0

我正在尝试void *block使用memcpy. 使用以下命令可以很好地阅读第一个:

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

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

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

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

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

4

4 回答 4

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)上崩溃。

于 2012-04-16T22:38:17.207 回答
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));
于 2012-04-16T22:27:47.340 回答
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]);
于 2012-04-16T22:27:31.470 回答
-1

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

int *a = (int *)block;

然后你可以简单地通过a[0]anda[1]

于 2012-04-16T22:30:11.943 回答