You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义与main函数原型一致的自定义函数指针数组?typedef指向main函数的函数指针的正确实现

如何定义与main原型一致的函数指针数组及正确的typedef写法

咱们先把你的问题拆成两部分来解决:先搞定指向main类型的函数指针的typedef,再看函数指针数组的定义,顺便解决你纠结的数组大小问题~

一、先纠正你的typedef写法

你写的typedef mainPtr(*f[])(int, char**);是不对的,原因有两个:

  1. typedef的语法是「typedef 原类型 别名;」,你把别名和原类型的顺序搞反了;
  2. 这里错误地把数组的写法混进了typedef里,你本来是想定义函数指针的别名,结果写成了数组类型的别名(而且写法还不对)。

main函数的标准原型是int main(int argc, char** argv),对应的函数指针类型是int (*)(int, char**)——拆解一下:这是一个指针,指向的函数接受int和char**参数,返回int。

所以正确的typedef应该是:

typedef int (*mainPtr)(int, char**);

这里mainPtr就是我们定义的别名,代表「指向和main同原型的函数的指针」类型。

二、定义与main原型一致的函数指针数组

有两种方式可以定义,取决于你是否用上面的typedef:

方式1:直接定义(不用typedef)

直接写出函数指针数组的类型,语法是:返回值类型 (*数组名[数组大小])(参数列表)

// 示例:初始化时传入元素,数组大小自动推导
int (*func_array[])(int, char**) = {&main, &my_main_func};

// 如果只声明不初始化,必须显式指定大小
int (*func_array[5])(int, char**); // 可以存放5个该类型的函数指针

方式2:用typedef简化(更清晰)

有了上面的mainPtr别名,数组定义就简洁多了:

// 初始化时自动推导大小
mainPtr func_array[] = {&main, &my_main_func};

// 显式指定大小的声明
mainPtr func_array[3]; // 可存放3个符合要求的函数指针

三、关于你纠结的「数组未定义大小」问题

在C语言里:

  • 如果数组初始化时提供了元素列表,编译器会自动根据元素个数推导数组的大小,不需要你显式写出来;
  • 如果只是声明数组但不初始化,那必须显式指定大小,否则编译器不知道要分配多少内存。

完整示例代码

#include <stdio.h>

// typedef出指向main类型的函数指针
typedef int (*mainPtr)(int, char**);

// 定义一个和main原型一致的测试函数
int my_custom_main(int argc, char** argv) {
    printf("Called my_custom_main with argc = %d\n", argc);
    return 0;
}

int main(int argc, char** argv) {
    // 方式1:直接定义函数指针数组
    int (*direct_arr[])(int, char**) = {&main, &my_custom_main};
    // 调用数组中的第一个函数
    direct_arr[0](argc, argv);

    // 方式2:用typedef的别名定义数组
    mainPtr typedef_arr[] = {&my_custom_main, &main};
    // 调用数组中的第二个函数
    typedef_arr[1](argc, argv);

    return 0;
}

补充一句:虽然标准C里对main函数的地址获取没有明确禁止,大多数编译器都是支持取&main的,所以上面的代码是可以正常编译运行的。

内容的提问来源于stack exchange,提问作者qu4lizz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:47:42