[英]Using memcpy to read two integers from a memory block
我試圖使用memcpy
從內存塊(我有一個指針void *block
指向該塊的內容)中讀取兩個連續存儲的整數。 使用以下命令可以很好地讀取第一個:
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]
和a[1]
來獲取它們
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.