【问题标题】:initialize an array of structs with function pointers in them C用函数指针初始化一个结构数组 C
【发布时间】:2013-07-26 17:54:02
【问题描述】:

我正在尝试初始化一个结构数组。结构中包含函数指针,并且定义如下:

typedef struct{
      char str[512];
      char *fptr;
} infosection;

然后我尝试创建一个数组:

infosection section[] = {
      ("Software", *SoftwarePtr),
      ("Hardware", *HardwarePtr),
 }

我使用一个简单的教程定义了函数指针。 函数软件返回一个int

int (*SoftwarePtr)()=NULL;
SoftwarePtr = &Software;

我的问题是关于我在编译时收到的警告。

初始化从没有强制转换的指针生成整数

警告引用节数组中的行。

所以我有两个疑问:

  1. 我是不是误用 */&/neither 作为指针?我已经尝试过每种方法的组合,但似乎仍然收到相同的警告。我知道每种方法的含义,只是不确定它们在这个特定情况下如何应用.
  2. 我可以像在这里一样在数组中声明infosection struct 的实例吗?我见过很多例子,人们在for loop 中声明他们的array of struct, 然而,我的最终产品需要包含在该数组中的一长串结构。我想让我的代码portable 以便人们可以在一个简单的列表中add structs(与要指向的函数相对应的字符串)时尚如所见。 这是声明数组实例的唯一方法吗

      infosection section[];
      section[0].str="software";
      section[0].fptr=SoftwarePtr;
    

澄清一下,我对structsarray of structsfunction pointers 进行了大量研究。只是这三者的组合似乎造成了麻烦。

【问题讨论】:

  • 我认为函数指针是 void *()。
  • @Jim 我在这里读到:newty.de/fpt/fpt.html#defi 需要用它们指向的函数的返回类型声明函数指针...
  • char *fptr; 这不是函数指针,char* 和函数指针之间的转换没有明确定义
  • 无论如何,一个更好的问题可能是:哪个垃圾编译器允许所有这些错误漏掉?请不要告诉我你正在使用 Turbo C...
  • 那是我的朋友 GCC

标签: c arrays struct function-pointers


【解决方案1】:

一个

我发现一个错误,函数指针的结构声明不正确:

typedef struct{
      char str[512];
      int (*fptr)();  // not char* fptr
} infosection;

两个

声明:

infosection section[] = {
      ("Software", *SoftwarePtr),
      ("Hardware", *HardwarePtr),
 }

应该是:

infosection section[] = {
      {"Software", SoftwarePtr},
      {"Hardware", HardwarePtr}
 }

删除*。并将内部( ) 替换为{ }

三个

infosection section[];
section[0].str="software"; // compiler error
section[0].fptr=SoftwarePtr;

你不能以这种方式分配字符串是错误的。您需要使用strcpy(),如下所示;

strcpy(section[0].str, "software");

【讨论】:

  • 尾随逗号没有任何问题:一些编码风格甚至喜欢它,因为它使每一行保持一致。数组初始化列表总是允许在最后一行结尾有逗号。
【解决方案2】:

结构成员当前是 char*,请更改为您的函数签名的正确指针类型。

typedef struct{
  char str[512];
  int (*fptr)();
} infosection;

* 取消引用指针,将 *foo 读作“foo 指向的内容”。 您想将 struct 成员设置为实际指针,也可以使用大括号而不是括号。

infosection section[] = {
  {"Software", SoftwarePtr},
  {"Hardware", HardwarePtr}
}

【讨论】:

    【解决方案3】:

    自从我玩指针以来已经有一段时间了,但也许构造函数会有所帮助?

    struct infosection{
          char str[512];
          char *fptr;
          infosection(char* strN, char* fptrN): str(strN), fptr(fptrN) {}
    };
    
    infosection[] isxn = { new infosection(&str1,fptr1), 
                   new infosection(&str2,fptr2)},
                   ... };
    

    我很抱歉...c 停止和 c++ 开始的地方在我的脑海中变得模糊,我看到了一个看起来像这样的 c 的解决方法(但不完全是,我确定一些指针的东西混淆了,但这是想法)

    struct infosection{
      char str[512];
      char *fptr;
    };
    
    infosection* myIS (char *strN, char *fptrN) {
      infosection i = new infosection();
      i.str = &strN;
      i.fptr = fptrN;
      return *i;
    }
    
    //infosection* newInfoSection = myIS(myStrPtr,myFptr);
    

    【讨论】:

    • 虽然构造函数是 C++ 的一部分,但在这个场景中不起作用 =)
    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多