【问题标题】:How do you typecast void pointers? [closed]你如何对 void 指针进行类型转换? [关闭]
【发布时间】:2019-07-03 16:58:47
【问题描述】:

我目前正在解决一个问题,我必须将一个 void 指针转换为一个有符号字符,短、长、长。 (这些看起来很简单,我可以创建一个 tmp,然后投射 void。)

让我困惑的是: 将 void 指针转换为: 有符号十进制、无符号八进制、无符号十进制、无符号十六进制、%f 转换 其中,“double arg 被四舍五入并覆盖为十进制。

对于大多数这些转换,我只会使用带有正确基数的 atoi 吗?

我将使用可变参数,并且会知道实际的值是什么,但我的计划是将所有内容类型转换为 void 指针,然后根据格式对其进行转换。转换是我不清楚的。为清楚起见:我将 va_arg 转换为 void 指针,并将其存储在结构中。然后根据格式,我将每个 void 指针转换为正确的数据类型。我只是想弄清楚如何对上面列出的数据类型进行每次转换

感谢您的任何帮助。

void    ft_conversion_length_di(t_main *node)
{
    if (node->length == 'H')
        node->arg = (signed char)node->arg;
    if (node->length == 'h')
        node->arg = (short)node->arg;
    if (node->length == 'l')
        node->arg = (long)node->arg;
    if (node->length == 'E')
        node->arg = (long long)node->arg;
}

【问题讨论】:

  • void pointer into a signed char.... - 你的意思是 pointer 指向这些?还是实际的数字类型?你的问题是混合主题。给我们一个示例代码并提出一个具体问题。
  • 请举例说明您正在尝试做的事情。
  • “将 void 指针转换为:有符号十进制、无符号八进制、无符号十进制、无符号十六进制……”是什么意思?这些不是 C 类型。
  • 描述是不够的,因为这些可能是 vauge。尝试解决问题的示例代码以及输入和预期输出将使我们更好地了解您到底想要做什么。
  • 只有当且仅当该值实际上是您证明的值时,您才能进行类型转换。如果你有void*,但它实际上是内存中的double,那么将其类型转换为int 将导致严重失败,二进制表示是不同的。 atoi 用于转换 ASCII 表示。如果您不知道您的void* 指向什么,请弄清楚。

标签: c casting type-conversion


【解决方案1】:

如果您从知道类型的可变参数函数中读取值,void * 不是您想要的。您可以将 void * 转换为另一种指针类型,但不能转换为“值”类型。

您想要的是一个可以容纳您期望的任何类型的联合,以及一个包含该联合和类型指示符的结构。

例如

enum value_type {
    VAL_CHAR,
    VAL_SHORT,
    VAL_LONG,
    VAL_LONGLONG,
    VAL_FLOAT,
    VAL_DOUBLE
};

union val {
   char c;
   short s;
   long l;
   long long ll;
   float f;
   double d;
};

struct value {
    enum value_type type;
    union val v;
};


void myfunc(const char *format, ...)
{
    va_list ap;

    va_start(ap, format);
    while (/* has more values */) {
        struct value s;
        if (/* is char */) {
            s.type = VAL_CHAR;
            s.v.c = va_arg(ap, char);
        } else if (/* is short */) {
            s.type = VAL_SHORT;
            s.v.s = va_arg(ap, short);
        } else if (/* is long */) {
            s.type = VAL_LONG;
            s.v.l = va_arg(ap, long);
        } else if (/* is long long */) {
            s.type = VAL_LONGLONG;
            s.v.ll = va_arg(ap, long long);
        } else if (/* is float */) {
            s.type = VAL_FLOAT;
            s.v.l = va_arg(ap, float);
        } else if (/* is double */) {
            s.type = VAL_DOUBLE;
            s.v.l = va_arg(ap, double);
        }
        /* do something with s */
    }
    va_end(ap);
}

【讨论】:

  • 所以,据我所知。 void 指针就像一个指针,在简单的类型转换时不保存任何真值。这就是为什么您不必为 void 指针分配空间,因为它们只是指向一个地址?我并不是说这是一种合理的做法,但是如果 void 指针指向正确的数据类型,那么输出仍然不会是正确的“值”类型吗?那么,这就是为什么工会是更好的选择?感谢您清理问题!
  • @AlanBarrettII 问题在于va_arg 返回给定值,而不是指向它的指针,因此您不能只将void * 指向返回值。做类似int x=4; void *p = x;的事情是没有意义的
猜你喜欢
  • 1970-01-01
  • 2015-02-14
  • 2021-09-20
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多