![](/img/trans.png)
[英]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.