知道列表元素的数据类型

时间:2010-08-19 05:09:43

标签: c data-structures

我有5个元素的列表。我得到这个列表的第一个元素。我怎么能知道这个元素char *或int *的数据类型是什么?

谢谢

3 个答案:

答案 0 :(得分:1)

在C中,没有(便携式)方法可以找出你所拥有的是否为空*。因此,当您将元素存储到列表中时,您必须自己跟踪它。另一种可能性是使用特定于类型的列表而不是通用的void *列表。

答案 1 :(得分:1)

你不能。

使用特定于类型的列表(一个列表用于您的指针,一个列表用于您的整数)或使用结构或联合来存储两种类型的值和一个指示类型的字段,如下所示:

#define TYPE_INT    1
#define TYPE_STRING 2

struct MyValue
{
int type;        // TYPE_INT or TYPE_STRING
union
   {
   char *str;
   int   i;
   } value;
};

将此结构存储到列表中。

如果C ++是一个选项,请考虑使用std :: list存储特定于类型的数据,或者如果这不可能,请定义一个类似上面结构的类,在该类中屏蔽不同的数据类型,如下所示(不包括错误检查类型):

class MyValue
   {
   public:
      enum ValueType
         {
         TYPE_NONE;
         TYPE_INT,
         TYPE_STRING
         };
      MyValue() : m_type(TYPE_NONE) {}
      MyValue(char *s) : m_type(TYPE_STRING), m_value.str(s) {}
      MyValue(int i) : m_type(TYPE_INT), m_value.int(i) {}
      ValueType getType() const {return m_type;}
      const char *getString() const {return m_value.str;}
      int getInt() const {return m_value.int;}
   private:
      ValueType m_type;
      union InternalValue
         {
         char *str;
         int   i;
         };
      InternalValue m_value;
   };

答案 2 :(得分:0)

这里的“列表”是什么意思?

是吗:

   sometype* lst;

即。数组,或:

node* lst;

链表?

在第一种情况下,sometype定义数组中元素的类型,除非它是某种void*,这意味着编译器不知道类型而是程序员(希望如此)确实。在第二种情况下,您应该查看node的定义,它应该包含具有某种类型的输入信息的数据(并且上面的void*参数适用)。