gpt4 book ai didi

c - 在 C 中用循环填充函数数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:25 24 4
gpt4 key购买 nike

下面的代码只是一个人为的例子,我发明了它来测试 C 中原则上可能发生的事情。函数 test 返回一个指向数组的指针,该数组包含十个指向返回整数的函数的指针。

#include <stdio.h>
#include <stdlib.h>

int f0(){return 0;}
int f1(){return 1;}
int f2(){return 2;}
int f3(){return 3;}
int f4(){return 4;}
int f5(){return 5;}
int f6(){return 6;}
int f7(){return 7;}
int f8(){return 8;}
int f9(){return 9;}

int (*((*test())[10]))(){
int (*(*ret)[10])() = malloc(sizeof(int(*[10])()));
(*ret)[0] = f0;
(*ret)[1] = f1;
(*ret)[2] = f2;
(*ret)[3] = f3;
(*ret)[4] = f4;
(*ret)[5] = f5;
(*ret)[6] = f6;
(*ret)[7] = f7;
(*ret)[8] = f8;
(*ret)[9] = f9;
return ret;
}

int main(int argc, char *argv[]){
int i;
int (*(*farray)[10])() = test();
for (i=0; i<10; i++){
printf("%d\n", ((*farray)[i])());
}
return 0;
}

现在我想知道如果我们规定我们不能改变main-method,有什么办法可以让这段代码更短吗?

程序必须输出数字 0 到 10。

数组*ret可以用for循环填充吗?它不必安全或干净,它必须符合 C89、C99 或 C11。

最佳答案

声明一个本地数组然后复制它是我的偏好。更不用说一些 typedef 来减少眼睛疲劳:

typedef int (*func_type)();
typedef func_type func_array_type[10];

func_array_type * test()
{
func_array_type fns = { f0, f1, f2, f3, f4, f5, f6, f7, f8, f9 };
func_array_type *ret = malloc( sizeof(func_array_type) );
if( ret ) memcpy( ret, fns, sizeof(func_array_type) );
return ret;
}

由于在这种情况下返回的函数总是相同的,因此可以将局部数组声明为静态的。然后你必须问问自己是否需要动态分配:

func_array_type * test()
{
static func_array_type fns = { f0, f1, f2, f3, f4, f5, f6, f7, f8, f9 };
return &fns;
}

可能取决于调用者是否 promise 不修改数组。

关于c - 在 C 中用循环填充函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35568022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com