首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

除非后面跟着lua_pop(),否则调用lua_getglobal()会崩溃

lua_getglobal()是Lua提供的一个函数,用于获取全局变量的值。它的作用是从Lua的全局环境中获取指定名称的变量,并将其值压入Lua栈中。

在使用lua_getglobal()函数时,需要注意以下几点:

  1. 参数:lua_getglobal()函数接受一个Lua状态机指针和一个字符串参数,表示要获取的全局变量的名称。
  2. 崩溃问题:如果调用lua_getglobal()函数时没有跟着lua_pop()函数,可能会导致栈溢出或内存泄漏等问题,但不会直接导致崩溃。具体的崩溃原因可能与代码的其他部分有关,比如后续对栈的操作不正确等。
  3. 错误处理:在实际使用中,建议在调用lua_getglobal()函数之前,先使用lua_isnil()函数判断变量是否存在,以避免获取不存在的全局变量导致的错误。
  4. 示例代码:
代码语言:lua
复制
lua_State* L = luaL_newstate();
luaL_openlibs(L);

// 假设Lua脚本中存在全局变量name
lua_getglobal(L, "name");
if (lua_isstring(L, -1)) {
    const char* name = lua_tostring(L, -1);
    printf("name: %s\n", name);
}
lua_pop(L, 1);  // 弹出栈顶的值

lua_close(L);

在上述示例代码中,我们首先创建了一个Lua状态机,并打开了Lua标准库。然后使用lua_getglobal()函数获取全局变量name的值,并通过lua_tostring()函数将其转换为C字符串进行打印。最后使用lua_pop()函数将栈顶的值弹出。

总结:lua_getglobal()函数用于获取Lua全局变量的值,但在使用时需要注意栈的管理,避免栈溢出和内存泄漏等问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Lua学习笔记:CC++中调用Lua函数示例

int tyep = lua_getglobal(L, "func2");// 以保护模式调用函数 调用后必须还原堆栈,如果有2个返回值,必须lua_pop(L,2)// 当函数调用完毕后,所有的参数以及函数本身都会出栈...luaL_openlibs(L);// 加载lua文件并执行 名称为 main.luaif (luaL_dofile(L, "Test5.lua")){// 在lua中 -1表示栈顶 如果出错 出错结果放置在栈顶中...include #include void Lua_refFunc(lua_State* L){ // 从全局环境中获取 "add" 函数,并压入栈顶 lua_getglobal...luaL_openlibs(L);// 加载lua文件并执行 名称为 main.luaif (luaL_dofile(L, "Test5.lua")){// 在lua中 -1表示栈顶 如果出错 出错结果放置在栈顶中...luaL_openlibs(L);// 加载lua文件并执行 名称为 main.luaif (luaL_dofile(L, "Test5.lua")){// 在lua中 -1表示栈顶 如果出错 出错结果放置在栈顶中

10620

C++调用lua 运行方式、案例亲测 及 常用API

//在向栈中压入数据时,可以通过调用下面的函数判断是否有足够的栈空间可用,一般而言,Lua预留20 //个槽位,对于普通应用来说已经足够了,除非是遇到有很多参数的函数。...lua_istable (lua_State *L, int index); int lua_isuserdata (lua_State *L, int index); 以上函数,成功返回1,否则返回...//Lua还提供了一个宏用于弹出指定数量的元素:#define lua_pop(L,n) lua_settop(L, -(n) - 1) 执行lua代码 void lua_call (lua_State...如果在执行的过程中有错误发生,lua_pcall 捕捉该错误,并将错误信息推送到 Lua 栈上,并返回一个错误码。...lua_getglobal(pState, "print_hello"); lua_pcall(pState, 0, 0, 0); ///< 调用计算函数 lua_getglobal

1.2K10
  • C语言调用Lua函数

    然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎告诉你回答了多少问题。阅读了相当于一部《红楼梦》那么多的文字。仅仅是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识。...调用一个函数的步骤非常easy: 1.压入你要调用的函数,使用lua_getglobal。 2.压入调用參数。 3.使用lua_pcall 4.从栈中弹出结果。...{ double z; lua_getglobal(L, “f”); lua_pushnumber(L, x); lua_pushnumber(L, y)...L, -1)) error(L, “function ‘f’ must return a number”); z = lua_tonumber(L, -1); lua_pop...那么返回个非0值。 (完) 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115446.html原文链接:https://javaforall.cn

    2.5K20

    Lua使用心得(1)

    Lua变成我们程序的一部分之后,我们还要使用它,要记住我们的目标是用脚本程序控制我们宿主程序的执行流程,那我们就要完成两步,一是用mfc程序调用lua的函数,二是用lua调用mfc的函数,下面的内容对于初学者可能开始有点难理解了...click函数,然后把这段代码放进去: StackDump(lua); luaL_dofile(lua, “test.lua”); // 解释分析lua文件 StackDump(lua); lua_getglobal...执行结果被压栈,所以取得最顶端的一个数就是结果值,-1就是指取栈顶的值 CString str; str.Format(“%d”, d); AfxMessageBox(str); StackDump(lua); lua_pop...,说明我们返回的字串被lua接收到了,lua的第二行我们没有接收它的返回值,则这个返回值自动被抛弃了。...lua_pop() (L, 1)就是把栈顶的一个元素弹出来,lua_pop()(L, 2)就是把栈顶的两个元素弹出。

    49210

    Redis作者谈如何编写系统软件的代码注释

    scripting.c: / *初始Stack:array* / lua_getglobal(lua,"table"); lua_pushstring(lua,"sort");...那么我们就再试验 *使用较慢的功能来处理这种情况,这个功能是 *是:table.sort(table,__ redis__compare_helper)* / lua_pop...假设的场景是:有一个代码阅读者跟随在上面的函数中的每个调用,同时手上也有一个Lua API参考,将能够根据每一行注释中stack的阵列布局在心中重现Stack堆栈布局....因为在编写代码时,原始作者就是这么想象的:在每次调用后想象一下当前堆栈里的情况。这样大家阅读这样代码才会想象一致,显得非常轻松,也无需考虑Lua API本身的难易程度了。...*内存不足返回0,否则返回1.对于下面的迭代函数这是不同的helper函数 * / int raxSeekGreatest(raxIterator * it){ ...

    82660

    Lua学习笔记

    冒号操作符使调用o.foo时将o隐含的作为函数的第一个参数。 Lua会调整一个函数的返回值数量以适应不同的调用情况。若将函数调用作为一条单独语句时,Lua丢弃函数的所有返回值。...在调用read是可以指定多个选项,函数根据每个选项参数返回相应的内容。 调用io.read()从输入文件中最多读取n个字符,如果读不到任何字符,返回nil。否则返回读取到的字符串。...在向栈中压入数据时,可以通过调用下面的函数判断是否有足够的栈空间可用,一般而言,Lua预留20个槽位,对于普通应用来说已经足够了,除非是遇到有很多参数的函数。...Lua调用C程序: 通常而言,当一个被Lua调用的C函数检测到错误时,它就应该调用lua_error,该函数清理Lua中所有需要清理的资源,然后跳转回发起执行的那个lua_pcall,并附上一条错误信息...]]-- --17.C调用Lua-- --[[ lua_getglobal是宏,其原型为:#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX

    3.1K60

    ZooKeeper和ZAB协议

    dataDir ZooKeeper用来存储内存数据库快照的目录,并且除非指定其他目录,否则数据库更新的事务日志也会存储在该目录。可以配置dataLogDir指定ZooKeeper事务日志的存储目录。...可靠性:一个更新操作一旦被接受即不会意外丢失,除非被其他更新操作覆盖。 最终一致性:写操作最终(而非立即)会对客户端可见。...崩溃恢复: 当leader实例宕机崩溃,或者因为网络原因导致其与过半的follower都失去联系,那么就会进入崩溃恢复阶段。...leader宕机或者与过半的follower失联都会导致leader重新选举(选举算法文章后面会介绍)。选举结束后会紧着进入数据崩溃恢复,以保证数据一致性,也就是数据同步。...在新的leader选举出来后就会进行数据同步工作,leader会将那些没有被follower同步的事务以Proposal消息的形式发送给follower,并在每个Proposal消息后面跟着发送一个commit

    55940

    复杂而艰辛的重构之路--起步

    你有没有试过,当你踏入一个新的公司,看到了几千几万几十万代码的时候,那种崩溃的感觉? 代码多不可怕,怕的是代码的可读性、维护性、扩展性是如此之差,这时候该怎么办呢?...4、统一wcf、webservices、webapi等接口,尽量使用统一方式,方便调用。...如果调用的时候用的是自动更新方式,那就统统使用这种方式,如果是手动编写的,千万别放在一个类里(博主已经崩溃中) 刚接触项目的时候,我一直觉得他们是直接引用,然后手动右键获取更新,谁知道他们是把增量代码手动复制到...遇到这个问题,我真心没法修改,动一动把命送,因为merge的都是外国人,英语也不好,只能先暂时跟着他们的思路走,等英语好了再说吧。 5、把项目中的缓存用统一的方式。...这个是一个非常有必要的做法,不管你是重构、新建,都一定要注意这点,否则后期你维护或者更换的话让你痛不欲生。

    57290

    Lua连续教程之C语言API总览

    CAPI中的大多数函数都不会检查其参数的正确性,我们必须在调用函数前确保参数的合法性,一旦出错,程序直接崩溃而不会收到规范的错误信息。...随后我们可以通过函数lua_tostring获取错误信息,并在打印错误信息后使用函数lua_pop将从栈中删除。 在C语言中,真是的错误处理可能相当复杂,并且如何处理错误取决于应用的性质。...如果可能,函数lua_checkstack增加栈的大小,以容纳所需的额外空间;否则,该函数返回零。...在调用函数lua_settop时也可以使用负数索引;基于这个功能,CAPI提供了下面的宏,用于从栈中弹出n个元素: #define lua_pop(L,n) lua_settop(L,-(n) -1)...此外,许多操作可能抛出异常。例如,访问一个全局变量可能触发__index元方法,而该元方法又可能抛出异常。最后,分配内存的操作触发垃圾收集器,而垃圾收集器又可能会调用同样可能抛出异常的析构器。

    1.2K40

    React Native项目组织结构介绍

    inspect元素:在模拟器中打开inspect element面板,点击模拟器中的元素,chrome跳转到对应dom。 槽点: 在浏览器改动css后,模拟器的布局不跟着更新。...遇到的坑: 模拟器中的程序经常崩溃,代码语法有低级错误,一但reload js,程序就有很大概率崩溃,需要react-native run-android重新开始。...换工程运行项目,react-native run-android 前最好关下后台,否则两个项目互相影响。 出错提示很不完善。 比如有时我会将误写成,或者忘记关闭标签。...但后面发现了奇怪的问题,只有在浏览器调试的时候,app才能正常运行,否则什么也不显示,而且没有任何提示。...如果你不幸这么做了,整个页面不显示了,而没有任何提示。。。 如果ListView包在一个View中,那么外面这个View需要设置style={flex: 1}。否则ListView将不能滚动。

    2.5K70

    【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

    (不是void,不需要写) 对象实例化时编译器自动调用对应的构造函数。 构造函数可以重载。 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明。...拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错, 因为引发无穷递归调用。 若未显式定义,编译器会生成默认的拷贝构造函数。...而自定义类型是调用其拷贝构造函数完成拷贝的。 类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请 时,则拷贝构造函数是一定要写的,否则就是浅拷贝。...上面的代码运行后会崩溃。 类中只有内置类型,没有显式写出拷贝构造函数,编译器会给出默认的拷贝构造函数,进行浅拷贝。...常引用 b是a的别名,修改b时,a也跟着改变。如果传参时想要改变外面的,就要传引用,但如果不想改变外面的,就需要用const引用。const引用是别名但是不能修改,即权限的缩小。

    16710

    计算机预处理详解

    #define do_forever for( ; ;) //一种替换 #define CASE break;case //如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠...#define MAX 100;//在定义标识符的时候加上了一个分号,在正常的语句下,连续使用两个分号,编译器认为后面那个是一个空语句,但是在下面的场景会出现问题: if(condition)...max = MAX; else max = 0; if语句不加中括号,默认只会跟着一条语句,这里相当于是有两条语句了,下面再出现else的时候就会出现语法错误。...除非宏比较短,否则可能大幅度增加程序的长度。 宏没办法进行调试。 宏虽然与类型无关,但是这样不够严谨。 宏可能带来运算级优先的问题,容易导致出错。...#define "stdio.h" 大大降低查找效率 我们在进行一段工程的时候,会经常出现嵌套文件的存在,这个时候一个文件底下可能调用了多次同样的头文件或者本地文件,这样大大降低效率,避免出现这种问题

    8900

    C++核心准则E.30:不要使用抛异常声明

    那样还好,假设我们已经检查过了,这种事情不会发生,这时如果f被修改为抛出一个新异常Z,系统马上就会发生崩溃除非我们修改use()(并且重新进行完整测试)。...我可以修改use()将Z传出,但是接下来user()的调用者可能需要跟着修改。情况很快就会失控。或者我们可以为use()增加try-catch结构将Z映射到一个可以接受的异常。情况很快再次失控。...注意成组修改异常经常发生在系统的底层(例如由于网络库或某个中间件发生变化),因此变更会像气泡一样向上传递至整个调用链。在大规模代码中,这可能意味着没有人可以将库更新到新版本,直到最后的调用者发生变更。...如果use()是库的一部分,它可能无法更新,因为这种变更不知道影响谁。

    45110

    使用复述,实现分布式锁及其优化

    如果需要一个阻塞式的锁方法,可以将tryLock方法包装为轮询(以一定的时间间隔来轮询,这很重要,否则复述,吃不消!)。...而添加后面复杂逻辑的原因只是因为SETNX与到期这两条命令执行的原子性无法得到保证。...不过此种情况基本可以认为是复述,服务器已经崩溃(除非是开发阶段就可以排除的参数错误之类的问题),那么锁的安全性就已经不是这里可以关注的点了。这里认为对客户端来说是相对原子性的就足够了。...,发生永久死锁) * *除非脚本在复述,服务器执行时复述,服务器发生崩溃,不过此种情况锁也失效 * / 私人 静态 最后RedisScript SETNX_AND_EXPIRE_SCRIPT...,发生永久死锁) * *除非脚本在复述,服务器执行时复述,服务器发生崩溃,不过此种情况锁也失效 * / 私人 静态 最后RedisScript SETNX_AND_EXPIRE_SCRIPT

    860100

    MongoDB副本集搭建

    我们之前的案例都是在单个节点上实现的,在生产环境中这种做法是有风险的,如果服务宕机、崩溃或者硬盘坏了都会对公司业务造成损失,因此我们需要数据备份。...MongoDB中我们可以通过副本集来实现这一需求,MongoDB副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成,如果Primary崩溃了...,自动从Secondary中选择一个将其升级为新的主服务器,本文我们先来看看副本集环境的搭建。...如果此时我们尝试向备份节点中直接写入文档,会发现写入失败,这里需要注意备份节点中的数据都是备份来的,不可以直接写入,想写入,除非等它的身份转为主节点才可以。...replSet=rs,表示副本集的名称,修改后的配置文件内容如下: 修改完成之后,分别启动三台服务器上的MongoDB,启动成功之后,连接上任意一台的shell,连接成功之后,先定义配置文件,如下: id后面跟着的是副本集的名称

    1.4K70

    c#面试题抽象类和接口的区别-程序员面试:面试官常问的Java面试题有哪些?

    同时调用两个不同包中相同类名的类时c#面试题抽象类和接口的区别,应加包名区分。因此,包可以避免名称冲突。   3.包也限制了访问权限,只有具有访问权限的类才能访问包中的内容。   ...Q5:Java导入包时,子包导入吗?   答:在Java中导入包时,其子包不会导入,如有必要,开发人员必须单独导入。开发人员需要单独导入它们。   Q6:类中的main方法可以声明为?   ...答:try后面经常跟着catch或,try抛出的任何异常都会被捕获到catch中,在代码终止之前要执行的任务都会被捕获到中。   Q10:有没有办法在出现异常时跳过?   ...答:当try出现异常时,如果有catch,将首先被catch捕获,否则将执行到。...除非try末尾有强制中止代码:system.exit(0),否则必须执行;   以上就是小编为大家整理发布的“程序员面试:面试官常问的Java面试题有哪些?”

    44020
    领券