[英]How can I multiply a 64-bit unsigned int with a 32-bit unsigned int on C without using long long?
[英]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));
}
它應該為我提供一個多用途的數組(用於存儲int
和char*
,如果我理解只能使用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.