【问题标题】:How to convert void * to int without losing information (in c)?如何将 void * 转换为 int 而不会丢失信息(在 c 中)?
【发布时间】:2020-03-29 15:35:17
【问题描述】:

如果 void* 包含可变数量的信息,那么简单地将其存储在整数中会不会丢失信息?信息不应该存储在几个整数(aka int*)中吗?

例如:

int func(void* info){
int num = (int)info;
return num;
}

如果 info = Absdfsdfskewlrew.... ,难道 num 不能正确保存这些信息吗?

【问题讨论】:

  • 是的。您不能在 32 位 int 中存储超过 32 位的信息。但你为什么要问?你为什么要“将void * 转换为int”?您是在尝试转换指针还是它指向的数据?
  • 您正在将info 中存储的地址类型转换为一个int,而不是该地址中存储的数据。但是,将void * 中存储的地址转换为有符号整数类型的正确数据类型是intptr_t
  • 有人告诉你void * 是 C 中的“通用”类型吗?那可以“保存”任何类型的数据吗?这并不完全正确。 void * 是一个通用的指针类型,可以指向任何类型的数据。

标签: c type-conversion


【解决方案1】:
  1. 将指针传递给 int 变量
int func(void* info)
{
   // not very good. Pointer punning should be avoided
   int num = *(int *)info;

   // or better
   memcpy(&num, info, sizeof(num));

   /* other code */

   return num;
}


//And usage

int x = 6;
func(&x);

【讨论】:

    【解决方案2】:

    void* 有时用于将指向“任何类型”值的指针传递给函数。

    您还需要另一个参数来描述 void* 实际指向的内容,以便您可以将其转换为正确的指针类型。

    下面的例子说明了这个概念:

    #include <stdio.h>
    
    typedef enum {
        what_int,
        what_float,
        what_string
    } what_t;
    
    void print_it(what_t what, void *value)
    {
        switch (what) {
            case what_int:
                printf("It is an int: %d\n", * (int*) value);
                break;
            case what_float:
                printf("It is a float: %f\n", * (float*) value);
                break;
            case what_string:
                printf("It is a string: %s\n", (char*) value);
                break;
            default:
                printf("I don't understand what it is\n");
        }
    }
    
    int main()
    {
        int i = 5;
        print_it(what_int, &i);
    
        float f = 3.1415;
        print_it(what_float, &f);
    
        char *s = "Hello world";
        print_it(what_string, s);
    
        return 0;
    }
    

    这个程序的输出是:

    It is an int: 5
    It is a float: 3.141500
    It is a string: Hello world
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多