我正在尝试void *block
使用memcpy
. 使用以下命令可以很好地阅读第一个:
memcpy(&test, block, sizeof(int));
我尝试使用以下方法阅读第二个:
memcpy(&test, block + sizeof(int), sizeof(int));
(当然我在程序的不同执行实例中有这些状态,所以问题不在于测试被覆盖)
但我没有得到正确的结果!我在这里做错了什么?
这是非标准的:
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)上崩溃。
使用以下命令可以很好地阅读第一个:
memcpy(&test, block + sizeof(int), sizeof(int));
我尝试使用以下方法阅读第二个:
memcpy(&test, block + sizeof(int), sizeof(int));
那是同一段代码......所以它会做同样的事情(假设你没有修改test
或block
在调用之间,你没有向我们展示)。
您正在覆盖 处的第一个值&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));
您正在读取相同的内存位置两次!您可能想要以下内容:
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]);
您从同一地址读取两个整数。这种方式也太冗长了。尝试:
int *a = (int *)block;
然后你可以简单地通过a[0]
anda[1]