如何将void *初始化为已知数据类型

时间:2014-01-21 16:01:49

标签: c void-pointers msp430 iar

我有一个包含大量信息的结构数组,这些信息在编译时将是一个常量。我正在尝试初始化数组,以便与特定变量相关的所有信息都在一个位置。我遇到的问题是数据类型可以是var_ptr或var_max的任何数字类型(另一个成员跟踪处理的类型)。

我使用void *作为指针,但我需要一些方法来分配内存并初始化它。请参阅下面注释掉的.var_max =&(23),了解我正在努力实现的目标。

typedef enum{
  INT,
  CHAR,
  LONG,
  LONGLONG,
  FLOAT
} data_type_t;


typedef struct param_t param_t;


struct param_t{
  const char* name;                     //Text name of variable
  const void* var_ptr;                        //Pointer to variable
  const void* var_max;                  //Pointer to max limit of var_ptr, same datatype
  int (*p_func)(const param_t*, char *);//Function to process parameter variable
  const data_type_t data_type;          //Data type of 
};


int MinMax_handler(const param_t *, char *);

extern int Hours, Minutes, Seconds;
/******************Variables go here******************/
const param_t param[] =
{
  {.name = "DEV_RTC_HR", .var_ptr = &Hours, /*.var_max = &(23),*/ .p_func = &MinMax_handler, .data_type = INT},
  {.name = "DEV_RTC_MIN", .var_ptr = &Minutes, .p_func = &MinMax_handler, .data_type = INT},
  {.name = "DEV_RTC_SEC", .var_ptr = &Seconds, .p_func = &MinMax_handler, .data_type = INT}
};
/*****************************************************/

注释掉.var_max =&(23)允许它编译并且似乎工作正常。

这听起来像一个联合可能会工作,但会占用更多的内存,因为大多数数据类型将是int(16位)但我需要适应很长的(64位)。

我需要将此限制为C.最终版本将是50-150个数组元素,并在外部自动生成。

2 个答案:

答案 0 :(得分:0)

通过执行.var_max = &(23),你试图创建一个指向文字值的指针,这没有任何意义

你可以做以下两件事之一:

  1. 预分配内存,将值23放在那里,并将其用作指针

  2. 假设当数据的大小适合void *(即64位或更少,假设您在64位拱门上)时,您可以直接将值放入指针

    .var_max =(void *)23

答案 1 :(得分:0)

您需要一个操作员地址可以操作的对象,例如

long twentythree = 23L;

/* ... */, .var_max = &twentythree, /* ... */