【问题标题】:Is curly braces needed in initialization of an array of pointers in structure?初始化结构中的指针数组是否需要花括号?
【发布时间】:2018-08-14 08:16:48
【问题描述】:

我使用 Dev C++ 和 SPC5 Studio 编译了一个 C 代码,它的结构包含指向另一个结构的指针数组。

   typedef struct
    {
      uint16 Identifier_u16;
      void* const DataFncType;
    }ClassCfg_ts;

    typedef struct
    {
      uint32 Val_u32;
      ClassCfg_ts*  ClassRef_pu[2];
    }atrb_paramCfg_ts;

初始化如下所示

ClassCfg_ts ClassCfg1_s[] = {
{0,writeFucntion},//read write fucntion
{1,writeFucntion},//read write fucntion
{2,writeFucntion},//read write fucntion
};

ClassCfg_ts ClassCfg2_s[] = {
{0,writeFucntion},//read write fucntion
{1,writeFucntion},//read write fucntion
{2,writeFucntion},//read write fucntion
};

atrb_paramCfg_ts atrb_paramCfg_s[] =
{
{0,ClassCfg1_s},
{0,ClassCfg2_s},
};

在哪里定义了 writeFunciton。当使用 Dev C++ 时,此初始化工作完美,而在 SPC5 工作室中会发出警告以包含花括号,并且仅当初始化更改为时才会消失

atrb_paramCfg_ts atrb_paramCfg_s[] =
{
{0,{ClassCfg1_s}},
{0,{ClassCfg2_s}},
};

其中哪个是正确的初始化?

【问题讨论】:

  • 你知道void* const不能用来表示函数指针,是吗?
  • 它对我有用,我在调用它之前对使用的函数指针类型进行了转换。然而,这不是这里的问题,为了更好的标准,我对函数指针进行了不同的 typedef。
  • 只是指出从void* 转换为函数指针会产生未定义的行为,并且可能会在某些系统上导致奇怪的错误。代替void*,使用uintptr_t
  • @Lundin uintptr_t 对于函数指针同样不够用。回复:C11 7.20.1.4
  • "其中哪个是正确的初始化?" --> 无。 void * 未指定足够的宽度来正确存储函数指针。而是存储在一些函数指针中,根据需要在函数指针类型之间进行转换。 C11 §6.3.2.3 8

标签: c pointers data-structures


【解决方案1】:

ClassRef_p 是指向ClassCfg_ts 的指针数组。您需要大括号初始化数组。 {ClassCfg2_s} 是在上面的 sn-p 中初始化它的正确方法。

【讨论】:

  • 同意你的回答,但为什么 Dev C++ 接受它不带大括号?使用大括号,它会给出错误消息。
  • @ArunCheriyan;如果您使用 C 编译器或 C++ 编译器编译程序,请检查设置。
  • 编译器是 TDM-GCC 4.9.2 64bit
猜你喜欢
  • 2017-06-30
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2012-02-08
  • 2018-09-13
相关资源
最近更新 更多