
void(*signal(int, void (*)(int)))(int); 里面的部分是接收一个 int 和 一个函数指针, 这个是清楚的, 第一个 void 跟括号是什么意思...为什么最后还有一个 int 看不懂了....
1 zivyou 2020-05-28 16:50:18 +08:00 void (*)(int) 是一个类型(函数指针); signal(int, void (*)(int)) 是一个函数的定义 void(*signal(int, void (*)(int)))(int); 是一个类型给这个类型赋值。 最后的结果,signal 是一个函数指针,它的类型是 void( void(*)(int, void(*)(int))) (int) |
2 zivyou 2020-05-28 16:52:22 +08:00 @zivyou void(*signal(int, void (*)(int)))(int); 是一个类型给这个类型赋值。 => 是定义某个类型的变量 |
3 Vibra OP void (*)(int) 是一个类型(函数指针); signal(int, void (*)(int)) 是一个函数的定义 这两个能看懂,,,然后接下来 *signal 是什么意思? 我理解的是, signal 的返回值是一个指针,,,就是 signal 前面的*,,但是*没有声明类型... 还有,,,给指针赋类型, 不应该是括号写前面吗? 比如 int *a = (int *) malloc(sizeof(int)); 这样... |
4 ho121 2020-05-28 16:58:58 +08:00 via Android void(*signal(int, void (*)(int)))(int); 这句是一个函数声明,signal 是函数名,接受的参数类型是(int, void (*)(int)),返回值类型是 void (*)(int) |
5 Vibra OP @zivyou 这个 void( void(*)(int, void(*)(int))) (int) 最后一个 int 是什么意思 |
6 Vibra OP @ho121 意思是, 返回值还是一个函数指针是吗? `signal(SIGALRM, wakeup);` 这个代码是可以通过的, 后这个 `signal(SIGALRM, wakeup)(0);`可以编译通过, 运行不成功 [1] 49420 segmentation fault ./a.out |
8 whoami9894 2020-05-28 17:18:09 +08:00 就是#4 的答案 ```c void t(int i) { printf("%d\n", i); } void(*signal(int i, void(*f)(int)))(int i) { f(i); return &t; } int main() { signal(0, &t)(1); return 0; } ``` |
9 Vibra OP @whoami9894 是的, 是 4 的答案,,我现在已经明白了..感谢感谢 |
10 wangyzj 2020-05-28 17:35:13 +08:00 @whoami9894 #8 这段没问题,楼主调用(int)有问题看看其他代码把 |