【问题标题】:How do I convert from void * back to int in C如何在 C 中从 void * 转换回 int
【发布时间】:2010-07-08 02:22:30
【问题描述】:

如果我有

int a= 5;
long b= 10;
int count0 = 2;
void ** args0;
args0 = (void **)malloc(count0 * sizeof(void *));
args0[0] = (void *)&a;
args0[1] = (void *)&b;

如何将 args[0] 和 args0[1] 转换回 int 和 long? 例如

int c=(something im missing)args0[0]
long d=(something im missing)args1[0]

【问题讨论】:

  • 顺便说一句,我认为将void* 转换为intlong 并不是一个好习惯。在给定的平台上,整数和指针的宽度不必相同。一种更便携的方式是使用intptr_t 甚至更好的uintptr_t。这可以保证您不会丢失位。

标签: c


【解决方案1】:

假设您的 &a0 和 &b0 应该是 &a 和 &b,并且您的意思是 args0[1] 用于设置 long d,那么您在 args0[0] 中存储了一个指向 a 的指针,并在 args0 中存储了一个指向 b 的指针[1]。这意味着您需要将它们转换为正确的指针类型。

int c = *((int *)args0[0]);
int d = *((long *)args0[1]);

【讨论】:

    【解决方案2】:

    要从字面上回答你的问题,你会写

    int c = *((int *)args0[0]);
    long d = *((long *)args[1]);
    

    我可能对您的代码担心的是,您已经为指向您的位置的 指针 分配了空间,但您没有为 本身分配内存。如果您希望将这些位置保留在本地范围之外,则必须执行以下操作:

    int *al = malloc(sizeof(int));
    long *bl = malloc(sizeof(long));
    *al = a;
    *bl = b;
    void **args0 = malloc(2 * sizeof(void *));
    args0[0] = al;
    args0[1] = bl;
    

    【讨论】:

      【解决方案3】:

      试试这个:

       int c =  *( (int *)  args0[0]);
      
       long d = *( (long *) args0[1]);
      

      【讨论】:

      • int c=*((int)args0[0]);导致错误:'unary *'(具有'int')和 int c=((int *)args0[0]) 的无效类型参数; fprintf(stderr,"main(): %d \n",c);导致输出为 -4261808
      • 我不明白。我的答案与顶部的答案(已接受)有什么区别?
      • 当你第一次发帖时,'int' 后面的“*”由于某种原因丢失了,可能是因为它被解释为格式 - 请参阅 w31 的评论了解它的外观。
      【解决方案4】:

      您需要告诉它,当您取消引用时,void* 应该被解释为 int* 或 long*。

      int a = 5;
      long b = 10;
      void *args[2];
      args[0] = &a;
      args[1] = &b;
      
      int c = *(int*)args[0];
      long d = *(long*)args[1];
      

      【讨论】:

        【解决方案5】:

        虽然其他人已经回答了您的问题,但我将对您的代码 sn-p 的第一部分的最后三行发表评论:

        args0 = (void **)malloc(count0 * sizeof(void *));
        args0[0] = (void *)&a;
        args0[1] = (void *)&b;
        

        上面最好写成:

        args0 = malloc(count0 * sizeof *args0);
        args0[0] = &a;
        args0[1] = &b;
        

        malloc() 调用以这种方式更易于阅读,并且不易出错。你不需要在最后两个语句中进行强制转换,因为 C 保证了对象指针和 void 指针之间的转换。

        【讨论】:

          【解决方案6】:

          如果您正在测试,我建议将其用作外部函数,以获得更高的可读性:

          int get_int(void* value){
              return *((int*) value);
          }
          
          long get_long(void* value){
              return *((long*) value);
          }
          

          然后在您的代码中:

           int c =  get_int(args0[0]);
          
           long d = get_long(args0[1]);
          

          应该可以的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-27
            • 2013-08-29
            • 1970-01-01
            • 2018-08-23
            • 2019-11-19
            • 2015-12-03
            相关资源
            最近更新 更多