C语言中能否在函数内声明并定义函数?相关代码疑问
C代码问题解答
先明确核心误解:这段代码没有声明或定义new_func函数,void (*new_func)(int n1, int n2);是声明了一个函数指针变量,它的作用是指向一个「接受两个int参数、返回值为void」的函数。
1. 这种写法是否被允许?
合法,符合C语言标准。函数指针的声明、整数到函数指针的强制转换(平台允许的前提下)、通过函数指针调用函数,都是C语法允许的操作。
2. 是否可行?
可行性完全取决于传入的entry参数:
- 如果
entry确实是某个符合void(*)(int,int)类型的函数的地址(比如通过(int)&目标函数传入,且平台支持函数地址转int),那么调用new_func(x1,x2)可以正常执行目标函数,是可行的。 - 如果
entry是随机值、无效地址,或者对应的内存不是合法的可执行代码,那么调用行为属于未定义行为,程序必然出问题。
3. 编译正常但调试时程序退出的原因
编译通过是因为代码没有语法错误,编译器只会检查语法合规性,不会验证地址有效性。调试时退出的核心原因是传入的entry不是有效的函数地址:
- 可能传入的
entry是无意义的整数,转成函数指针后指向了无效内存,执行new_func(x1,x2)时触发内存访问错误(比如段错误),被系统强制终止。 - 也可能是平台上函数指针的长度和int类型长度不匹配(比如64位系统中函数指针占8字节,int占4字节),转换时丢失了高位地址,导致最终的函数指针指向错误区域,执行时崩溃。
内容的提问来源于stack exchange,提问作者abssyz
相关产品推荐
相关产品推荐

