簡體   English   中英

使用memcpy從內存塊讀取兩個整數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM