首先我說我看到一堆標題相似但不關注我的問題的帖子
我的任務是創建一個接收 void* arr、unsigned int sizeofArray 和 unsigned int sizeofElement 的函式我設法毫無問題地遍歷陣列,但是當我嘗試列印出這些值或對它們做任何事情時,我似乎得到了垃圾,除非我事先指定它們的型別
這是我的功能:
void MemoryContent(void* arr, unsigned int sizeRe, unsigned int sizeUnit)
{
int sizeArr = sizeRe/sizeUnit;
for (int i = 0; i < sizeArr ; i )
{
printf("%d\n",arr); // this one prints garbage
printf("%d\n",*(int*)arr); // this one prints expected values given the array is of int*
arr = arr sizeUnit;
}
}
使用以下陣列(int arr[] = {1, 2, 4, 8, 16, 32, -1};) 的輸出是:
-13296 1
-13292 2
-13288 4
-13284 8
-13280 16
-13276 32
-13272 -1
我意識到我必須以某種方式指定型別。雖然 printf 實際上不會被使用,因為我需要其中任何值的二進制表示(已經在不同的函式中處理)我仍然不確定如何在知道元素大小的情況下獲得實際值而不進行轉換任何解釋將不勝感激!
注意:使用的編譯器是 gcc,因此允許使用指標算術
編輯澄清:格式化后的輸出,對于前面示例的給定陣列,所有應該看起來像這樣
00000000 00000000 00000000 00000001 0x00000001
00000000 00000000 00000000 00000010 0x00000002
00000000 00000000 00000000 00000100 0x00000004
00000000 00000000 00000000 00001000 0x00000008
00000000 00000000 00000000 00010000 0x00000010
00000000 00000000 00000000 00100000 0x00000020
11111111 11111111 11111111 11111111 0xFFFFFFFF
uj5u.com熱心網友回復:
獲取 void 指標的值 獲取 void 指標的值,而只知道每個元素的大小
僅知道每個元素的大小時不可能獲取 void 指標的值。
假設大小為 4。元素是int32_t, uint32_t, float, bool, some struct還是enum, 指標等?是否有任何位填充?正確解釋位需要的不僅僅是知道大小。
代碼可以列印出這些位void *ptr并將解釋留給用戶。
unsigned char bytes[sizeUnit];
memcpy(bytes, ptr, sizeUnit);
for (size_t i = 0; i<sizeof bytes; i ) {
printf(" X", bytes[i]);
}
存在簡化。
OP 的代碼void* arr, ... arr = arr sizeUnit;不是可移植的代碼,因為添加到 avoid *不是由 C 標準定義的。一些編譯器確實允許它,類似于指標是char指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/409919.html
標籤:
上一篇:`int(*q)[m][n]=(int(*)[m][n])p;`這種型別轉換是否可行,其中p是普通整數指標`int*p`,它指向矩陣的基地址[復制]
