繁体   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