我正在尝试使用void *block
从内存块(我的指针memcpy
指向块的内容)中连续存储两个整数。第一个是使用以下内容阅读:
memcpy(&test, block, sizeof(int));
我尝试使用以下方法阅读第二篇:
memcpy(&test, block + sizeof(int), sizeof(int));
(当然我在程序的不同执行实例中有这些stataments,所以问题不在于覆盖测试)
但我没有得到正确的结果!我在这做错了什么?
答案 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));
这是同一段代码......所以它会做同样的事情(假设你没有在调用之间修改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));
答案 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]