簡體   English   中英

如何使用C在64位平台中將void *轉換為int?

[英]How to cast a void* to int in 64-bit platforms, using C?

我是負責C程序的語言學家,所以如果答案很明顯,請原諒。 我有以下代碼:

typedef struct array_s {
  (...)
  void **value;
} array_t;
typedef array_t *array_pt;

array_pt array_new (int size) {
  (...)
  array->value = (void **)malloc(size*sizeof(void *));
}

void* array_get (array_pt arr, int i) {
  return arr->value[i];
}

int main () {
  int a = 1234;
  int *ptr = &a;

  array_pt array = array_new(1);
  array_add(array, ptr);

  printf("%i\n", (int)array_get(array, 0));
}

它應該為我提供一個多用途的數組(用於存儲intchar* ,如果我理解只能使用void ),而且我認為分配/釋放沒有問題。 但是,我無法將其轉換為任何有用的內容(即,獲取“原始” int / char *),並且據我了解,這可能是因為我處於64位系統中,並且指向的指針大小void與指向int / char*的指針的大小不同(該程序應該在64位和32位系統中都使用)。 我嘗試使用intptr_t和其他替代方法,但是沒有運氣。

我如何確定該代碼將接受任何數據類型並在32位和64位系統上都能正常工作? 謝謝。

編輯:

很抱歉沒有添加array_add ,這里是:

unsigned int array_add (array_pt array, void *ptr) {
  (...) // get the next index
  // allocate if needed
  array->value = (void **)realloc(array->value, array->size*sizeof(void *));

  array->value[index] = p;
}

您需要取消引用指針:

int* temp = array_get(array, 0);
printf("%i\n", *temp);

但是,我強烈建議您避免使用這種方法。 您基本上是在放棄使用C編譯器通常提供的少量幫助-故意嘗試制作非類型安全的數組。

您需要確定在這種情況下要執行的操作。

(1)如果要使用void *數組存儲int值(將實際 int強制轉換為void * ),則應按以下方式將這些int值添加到數組中

int a = 1234; 

array_pt array = array_new(1); 
array_add(array, (void *) a); 

然后從數組中將它們取回,如下所示

int a = (int) array_get(array, 0); 
printf ("%d\n", a);

或簡單地

printf ("%d\n", (int) array_get(array, 0)));

最后一部分正是您所做的,但是您弄錯了第一部分。

這是基於轉換的方法,在許多方面都很丑陋,但是具有一定的實用價值,並且在void *足夠大以容納int 這種方法可能取決於32位和64位系統的屬性。

(2)如果要使用void *數組存儲int *值(指向int指針),則應按以下方式將這些int值添加到數組中

int a = 1234; 

array_pt array = array_new(1); 
array_add(array, &a); 

然后從數組中將它們取回,如下所示

int *pa = array_get(array, 0); 
printf ("%d\n", *pa);

或簡單地

printf ("%d\n", *(int *) array_get(array, 0));

這種方法對於任何可移植性問題都是絕對安全的。 它沒有32位或64位問題。 保證void *指針可以安全地保存int *指針或任何其他數據指針。

如果這是您的意圖,那么您得出的第一部分是正確的,最后一部分是錯誤的。

這個或那個。 您的代碼似乎是兩者的奇怪組合,這就是為什么它不起作用的原因,也是為什么無法從原始消息中找出您試圖使用哪種方法的原因。

intmax_t應該是一個整數類型,在32位編譯器上為32位,在64位編譯器上為64位。 您可以在printf語句中使用%j來打印intmax_t。 一個系統上的指針大小始終是相同的-與指向int,char或void的指針無關。

printf("%j\n", (intmax_t)array_get(array, 0));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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