Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >C语言。奇异函数行为

C语言。奇异函数行为
EN

Stack Overflow用户
提问于 2014-05-12 10:04:59
回答 1查看 127关注 0票数 1

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

代码语言:javascript
代码运行次数:0
复制
#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;
}

我想指出如果我改变了

代码语言:javascript
代码运行次数:0
复制
void init(void (**fn)()){
    int num = 1337;
    *fn = lambda(void,(){printf("%d\n",num);});
}

代码语言:javascript
代码运行次数:0
复制
void init(void (**fn)()){
    *fn = lambda(void,(){printf("%d\n",1337);});
}

它起作用了,但不能满足我的需要。

我很感激在这个问题上所提供的任何帮助或信息,因为我对此非常感兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-12 10:50:02

正如GCC嵌套函数的文档中所指出的:

如果您试图在包含函数退出后通过它的地址调用嵌套函数,那么所有的地狱都会崩溃。如果您试图在包含作用域级别退出之后调用它,如果它引用了一些不再在作用域中的变量,那么您可能是幸运的,但冒险是不明智的。

换句话说,你在这里试图做的事情--返回一个嵌套函数的引用--并不是真正得到GCC的认可。无论它在多大程度上正确工作,你都会感到幸运,因为GCC并不打算支持这个功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23615828

复制
相关文章
C语言迷惑行为大赏
由于你的代码前面并没有执行出错设置errno,因此errno会是0,而对应的描述信息就是Success。
编程珠玑
2020/06/19
4770
C语言strstr函数_c语言fwrite函数的用法
函数名: strstr 功 能: 在串中查找指定字符串的第一次出现 用 法: char *strstr(char *str1, char *str2); 程序例:
全栈程序员站长
2022/11/03
5.9K0
C语言strstr函数_strstr函数c语言实现
查找字符串的函数,语法规则char *strstr( const char *string, const char *strCharSet )用于查找字符串strCharSet是否为字符串string的子字符串,需要引用头文件#include <string.h>
全栈程序员站长
2022/11/04
5.7K0
C语言strstr函数_strstr函数c语言实现
C语言fread函数_C语言fread
The prototype of the function fread() is:
全栈程序员站长
2022/10/02
23.2K0
C语言fread函数_C语言fread
c语言fread函数的功能_c语言sizeof函数用法
C语言中:fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。下面我们来看看c语言fread函数的用法。
全栈程序员站长
2022/09/30
4.5K0
C语言函数pow(c语言pow函数头文件)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128228.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/26
4.4K0
C语言函数pow(c语言pow函数头文件)
C语言return函数
说到return,有必要提及主函数的定义。很多人甚至市面上的一些书籍,都使用了void main( )这一形式 ,其实这是错误的。
Java架构师必看
2021/03/22
3.2K0
C语言 | scanf函数
“要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人…万中无一” ——包租婆
小林C语言
2021/03/23
3.7K0
C语言函数递归_c语言递归举例
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说C语言函数递归_c语言递归举例,希望能够帮助大家进步!!!
Java架构师必看
2022/07/19
13.7K0
C语言函数递归_c语言递归举例
C语言 | 函数调用
在定义函数时函数名后面括号中的变量称为“形式参数”或“虚拟参数”;在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。
小林C语言
2021/04/14
3.3K0
C语言 | 函数调用
C语言内联函数
内联函数也称内嵌函数,它主要解决程序的运行效率。 函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些转移都需要时间开销。 有些函数在程序中使用率较高,但代码却很短。 我们可以在程序当中用表达式替换函数调用,但是降低了函数的可读性。 使用内联函数 内联函数必须在被调用前声明或定义。因为内联函数的代码必须在被替换之前已经声称被替换的代码。 注意: 1.在内联函数内不允许用循环语句和开关语句。递归函数是不能用来做内联函数的。 2.内联函数的定义必须出现在内联函数第一次被调用之前。 3.内联函数只适合于1-5行的小函数。对于一个含有很多语句的大函数,函数调用和返回的开销相对来说是微不足道的。
Java架构师必看
2021/03/22
1.3K0
C语言 | 函数概述
函数是从英文function翻译过来的,其实function在英文中的意思既是函数,也是功能。
小林C语言
2021/04/13
2.3K0
C语言 | scanf函数
在C语言中,输入是以计算机主机为主体而言的,从输入设备向计算机输入数据称为输入,C语言本身不包含输入语句。
小林C语言
2021/03/23
5.5K0
C语言 | scanf函数
C语言 system函数[通俗易懂]
windows操作系统下system () 函数详解(主要是在C语言中的应用) 函数名: system
全栈程序员站长
2022/11/04
2.9K0
C语言 system函数[通俗易懂]
【C语言】内存函数
从这篇开始,我们开始学习C语言的内存函数——memcpy、memmove、memset、memcmp
平凡的人1
2022/11/15
8890
【C语言】内存函数
7.1 C语言函数
1、函数是从英文function翻译过来的,其实function在英文中的意思既是函数,也是功能。、
小林C语言
2020/12/07
2K0
7.1 C语言函数
C语言 | 函数参数
以上,如果你看了觉得对你有所帮助,就给小林点个赞,分享给身边的人叭,这样小林也有更新下去的动力,跪谢各位父老乡亲啦~
小林C语言
2021/04/15
2.7K0
C语言 | 函数参数
C语言之函数
  结构化程序设计主张按功能来分析需求,主要原则自顶向下,逐步求精,模块化等。 主张按功能把软件系统逐步细分,每个功能都负责对数据进行一次处理,每个功能接收一些数据,处理完后输出一些数据,这种处理方式也被称为面向数据流的处理方式。 其最小单位是函数,每个函数负责一个功能,整个软件系统由一个个函数组成,其中作为程序入口的函数被称为主函数。 主函数依次调用其他普通函数,普通函数之间依次调用,从而完成整个软件系统的功能。   一个C程序可由一个主函数和若干个其他函数构成,主函数调用其他函数,其他函数也可互相调用。
互联网金融打杂
2018/04/03
2.9K0
C语言之函数
C语言(函数指针)
前几天在佛科大,惊闻某为同学学习指针学了一年,且未的要领!我当时除了深深吃了一斤之外,瞬间觉得自己的工作是如此的重要和迫切!对于指针这类调皮鬼,今天来聊聊函数指针这个特殊的一员。
用户2617681
2019/08/08
3.7K0
C语言(函数指针)
【C语言】内存函数
这里注意下它的参数的数据类型是无类型指针也就是说它是不会说必须是要整形指针类型或者是字符串类型这种,它所有的数据类型都是可以适用的因为它是 void * 类型的。 返回值:该函数返回一个指向目标存储区 str1 的指针。
謓泽
2022/12/12
2.3K0
【C语言】内存函数

相似问题

C++奇异函数行为

12

奇异C函数返回变量类型行为

33

Python奇异函数行为

11

奇异函数调用行为

12

奇异窗口函数行为

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文