【问题标题】:Function Pointer Array in CC中的函数指针数组
【发布时间】:2012-05-19 14:56:47
【问题描述】:

我想创建一个函数指针数组并能够在 for 循环中调用它们。我怎样才能做到这一点?我试过了:

void (**a) (int);
a[0] = &my_func1;
a[1] = &my_func2;
a[2] = &my_func3;

for ( i = 0; i < 3; i++){
    a[0]();
    (*a[0])(); // Neither does work
}

但我想我缺少一些语法:

error: too few arguments to function ‘*(a + (long unsigned int)((long unsigned int)i * 8ul))’

【问题讨论】:

  • 你应该为那个数组分配一些空间...

标签: c function function-pointers


【解决方案1】:

你声明的函数应该接受一个 int 作为参数:

a[0](1);

还请注意,您为函数声明了一个指向指针的指针,但您没有为它们分配任何内存(我假设这仅在示例中)否则它应该是:

void (*a[3]) (int);

【讨论】:

    【解决方案2】:

    您声明 a 是一个指针,指向一个函数的指针(或一个指针数组),该函数将 int 作为参数 - 因此您需要在调用函数时传递一个 int,例如a[0](42);.

    【讨论】:

      【解决方案3】:

      我猜下面的代码就是你需要的。

      typedef void * func_pointer(int);
      
      func_pointer fparr[10];
      
      for(int i = 0; i<10; i++)
      {
           fparr[i](arg); //pass the integer argument here
      }
      

      【讨论】:

      • 可能是typedef 语句中的拼写错误,我在编译代码时遇到错误,typedef void (*func_pointer)(int); 有效。请仔细检查:)。
      【解决方案4】:

      1) 你在哪里分配或定义了数组来存储函数地址?

      2) 在循环中你总是调用(*a[0])();,应该有循环计数器

      【讨论】:

        【解决方案5】:

        你忘了给你的函数一个参数。

        void (**a) (int); // here it takes an int argument
        a[0] = &my_func1;
        a[1] = &my_func2;
        a[2] = &my_func3;
        
        for ( i = 0; i < 3; i++){
            a[0](); // here you do not give an argument
        }
        

        但请注意,您没有为 a 数组分配内存,它会因分段错误错误而失败。

        void my_func1(int i) {
            ;
        }
        void my_func2(int i) {
            ;
        }
        void my_func3(int i) {
            ;
        }
        
        int main() {
            void (**a) (int);
            a = malloc(3*sizeof(void*)); // allocate array !
            a[0] = &my_func1;
            a[1] = &my_func2;
            a[2] = &my_func3;
        
            for (int i = 0; i < 3; i++){
                a[i](1); // respect your own function signature
            }
            free(a); // it's always a good habit to free the memory you take
            return 0;
        }
        

        【讨论】:

          【解决方案6】:

          你可以typedef void (*pfun)(int); 然后pfun a[3]; 是你想要的数组。

          以下代码可能对您有用:

          typedef void (*pfun)(int);
          
          int main() {
              pfun a[3];
              a[0] = myfunc1;    // or &myfunc1 whatever you like
              a[1] = myfunc2;
              a[2] = myfunc3;
          }
          

          【讨论】:

            【解决方案7】:

            您可以定义具有所需大小的函数数组并使用以下函数对其进行初始化:

            void my_func1(int x){}
            void my_func2(int x){}
            void my_func3(int x){}
            
            void (*a[])(int)={my_func1,my_func2,my_func3};
            
            
            int i;
            for(i=0;i<sizeof a/sizeof*a;++i)
              a[i](i);
            

            任何函数名之前的地址运算符“&”都是多余的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-05-13
              • 1970-01-01
              • 1970-01-01
              • 2021-12-07
              • 1970-01-01
              • 2023-04-04
              • 2021-12-27
              • 1970-01-01
              相关资源
              最近更新 更多