lua 源码分析

本文深入探讨了Lua与C语言的结合使用,包括lua_KFunction的委托概念,char**agrv作为字符串数组,void*ud的通用指针,以及void**ud的指针数组。此外,还解释了ptrdiff_t和intptr_t在指针运算中的作用,lua_KContext的类型适应性,结构体引用的差别,共用体的内存占用,memcpy和strcmp函数的用途,以及内存分配与释放的函数malloc和realloc。博客还提到了#define宏定义。通过这些内容,读者可以更好地理解两者之间的交互和C语言的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里只是列举了lua当中用到的c 语言的知识

1. lua_KFunction

这个类似c#中的委托  类型是lua_KFunction ,参数是后面三个

比如 定义一个 lua_KFunction  func1,就等于  声明了一个函数   int  *func1 (lua_State,int,lua_KContext)

2. char**agrv

相当于string[]数组

3.void*ud

它不是空类型,而是可以转换成任意类型的指针,比如可以转换为int,float 等

4.void**ud 

任意类型指针的数组

5.ptrdiff_t

《C和指针》P110 分析如下:两个指针相减的结果的类型为ptrdiff_t,它是一种有符号整数类型。减法运算的值为两个指针在内存中的距离(以数组元素的长度为单位,而非字节),因为减法运算的结果将除以数组元素类型的长度。所以该结果与数组中存储的元素的类型无关。 

ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。

6.intptr_t

在64位的机器上,intptr_t和uintptr_t分别是long int、unsigned long int的别名;在32位的机器上,intptr_t和uintptr_t分别是int、unsigned int的别名。

那么为什么要用typedef定义新的别名呢?我想主要是为了提高程序的可移植性(在32位和64位的机器上)。很明显,上述代码会根据宿主机器的位数为intptr_t和uintptr_t适配相应的数据类型。

另外,如注释所言,定义这两个数据类型别名也是为了“void *”指针。

在C语言中,任何类型的指针都可以转换为void *类型,并且在将它转换回原来的类型时不会丢失信息。

7. lua_KContext

综合前面两个 ,我们可以知道lua_KContext的意思,lua_KContext:当可以获取到intptr_t的时候,就是无符号整形,如果获取不到就是  有符号整形(ptrdiff_t)

8.&L 和*L

前面那个是引用,&表示取址,引用L的地址

后面那个是指针,表示取值,把L地址对应的值取出来

9. L->elem 和L.elem的用法

L->elem 中L必须是指针,而L.elem中的L一定是普通结构体变量
->和.都是引用结构体成员的运算符,前者是通过指针引用,而后者是通过变量引用

10.union  共用体

上面说完全覆盖并不准确,应该是占用内存大的成员会覆盖掉占用内存小的成员


union data{
    int n;
    char ch;
    short m;
};

很明显data所占用的内存,为成员中占用最大内存的成员内存,就是n,上图也表示了它们在内存中的表示方法,更改n会覆盖掉ch、m的值,更改ch、m的值只会影响n的一部分

11.memcpy

12.strcmp

13.数组的表现形式

14.(Node *)malloc(sizeof(Node))

15. void *realloc(void *ptr, size_t size);

16.#define

源码分析 参考:

https://blog.youkuaiyun.com/initphp/category_9293184.html?spm=1001.2014.3001.5482

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TO_ZRG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值