【问题标题】:C language. Strange function behaviorC语言。奇怪的函数行为
【发布时间】:2014-05-12 18:04:59
【问题描述】:

所以我正在编写一个生成函数的程序。我正在使用 GCC 嵌套函数模拟 lambda 表达式。但我遇到了奇怪的程序动作。也许我不知道这背后的一些理论,女巫带领我的程序做奇怪的动作。在这里我写了非常简化的代码,我在下面指出了问题所在。 程序应该只打印 N 次 '1337',但程序只打印一次就发疯了。

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

#define lambda(return_type, function_body) \
    ({ \
        return_type __fn__ function_body \
        __fn__; \
    })

void init(void (**fn)()){
    int num = 1337;
    *fn = lambda(void,(){printf("%d\n",num);});
}

int main(){
    void (*fn)();
    init(&fn);
    fn(); // Everything is fine, it prints '1337'
    fn(); // It prints '-1869573949' , maybe accessing memory somewhere
    fn(); // It does not print anything at all
    ...   // It does not print anything at all
    return 0;
}

我想指出,如果我改变了

void init(void (**fn)()){
    int num = 1337;
    *fn = lambda(void,(){printf("%d\n",num);});
}

void init(void (**fn)()){
    *fn = lambda(void,(){printf("%d\n",1337);});
}

有效,但不能满足我的需求。

感谢您提供有关此问题的任何帮助或信息,因为我对此非常感兴趣。

【问题讨论】:

标签: c function lambda crash functional-programming


【解决方案1】:

如 GCC 嵌套函数的文档中所述:

如果您在包含函数退出后尝试通过其地址调用嵌套函数,那么一切都会崩溃。如果您尝试在包含范围级别退出后调用它,并且如果它引用了一些不再在范围内的变量,那么您可能很幸运,但冒险并不明智。

换句话说,您在这里尝试执行的操作——返回对嵌套函数的引用——并没有真正得到 GCC 的认可。不管它在多大程度上能正常工作,你只是走运了,因为 GCC 并不意味着支持这个功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多