乐于分享
好东西不私藏

从两道笔试题说起:void * 和 void ** 的前世今生

从两道笔试题说起:void * 和 void ** 的前世今生

开篇:两道让很多同学懵圈的笔试题

先看两道真实出现在某C语言笔试中的题目:

1题:void * 解引用

int a = 10;void *p = &a;//p指向变量a

以下哪种写法可以正确地获取变量 a 的值(即 10)?

 A. printf("%d", *p);

B. printf("%d", *((int*)p));

C. printf("%d", (int)*p);

D. printf("%d", (int)p);

2题:void ** 作为函数参数

voidAllocMemory(void **pp, int size){*pp = malloc(size);//这里假设 nalloc()成功,不考虑分配失败场景}intmain(){void *ptr = NULL;AllocMemory(???, 100);//???处应该填什么? //函数返回后,ptr 指向什么?return 0;}

以下选项描述正确的是?

A. 应填(void**)ptr,返回后 ptr 指向 NULL;

B. 应填&ptr,返回后 ptr 指向 NULL;

C. 应填(void**)ptr,返回后 ptr 指向堆上的 100 字节内存;

D. 应填&ptr,返回后 ptr 指向堆上的 100 字节内存;

1题正确答案:B

  • A 错:void * 不能直接解引用,编译报错;
  • 正确:先把 p强制转换成 int *,再解引用;
  • C 错:*p 本身就已经非法了,转成int 也没用;
  • D 错:把地址值当整数打印,打印的是地址值本身(如0x7ffee...),而不是a 的值10;

2题正确答案:D

  • A 错:传 (void**)ptr 等于传了NULL,因为ptr 本身就是NULL;
  • B 错:虽然传的是&ptr(正确),但*pp = malloc(100) 已经修改了ptr,它指向堆内存;
  • C 错:传(void**)ptr 是错误的传参方式;
  • 正确:&ptr是 void **类型,传入后函数通过 *pp = malloc(100)修改了外部的 ptr,使其指向堆上的 100 字节内存;

两道题,一道考 void * 的解引用规则,一道考 void ** 作为输出参数的用法。

为什么这么多同学做错?

因为他们只知道“void * 是万能指针,但不知道这个万能到底是什么意思,更不知道 void *  void ** 到底有什么区别。在他们的认知里,void * 就像一个黑盒”---拿来就能用,但用起来全是坑。

要真正理解这两道题,得从 void * 的身世说起。

一、出身:void 的诞生

要理解 void * 的身世,得先认识它的父亲”---void 关键字。

1.1 void 诞生之前:一个默认 int”的混乱时代

 void 关键字出现之前(K&R C 时代,约 1978 年),C语言有一个今天看来不可思议的规则:隐式 int”implicit int

这意味着,如果你定义一个函数时没有写返回类型,编译器会默认认为它返回 int

do_something() {//没有写返回类型!printf("Not returning a value\n");}

这段代码在今天会编译报错,但在当时是合法的---编译器会认为 do_something() 返回一个 int

这种设计带来了几个严重的问题:

第一,意图模糊你看到 do_something() 时,根本无法判断它是真的返回一个 int”还是只是为了表示无返回值而省略了返回类型。代码的意图完全靠猜。

第二,类型不安全。信号处理函数这种无法返回值的函数,在当时也只能被定义为返回 int。调用者拿到的是一个无意义的垃圾整数值,但编译器不会给出任何警告。

第三,编译器检查失效。由于 char * 被当成了万能钥匙,编译器无法有效区分我真的想操作字符我只是在传递一个通用地址

1.2 void 的诞生:1979

1979年,void 关键字被引入C语言。

根据 TUHSUnix Heritage Society)邮件列表的记载,这场变革的核心推动者是Steve Bourne(著名的 Bourne Shell 的作者)。

当时,Steve Bourne 正在为Algol68 的实现工作,Algol68 中有一个表示无类型的关键字,他非常需要一个类似的功能来优化代码生成。他因此向C语言的设计者Dennis Ritchie提议增加 void 类型,但最初被拒绝了。

Bourne 没有放弃。他向Ritchie 证明,增加 void 类型可以让不返回值的函数在返回时节省一条CPU指令---这是一个实实在在的性能提升。

这个能提升效率的杀手锏最终说服了 Ritchie。于是,void 关键字被正式加入了C语言,最初的用途是声明不返回任何值的函数

//明确表示:这个函数不返回值void do_something() {printf("Not returning a value\n");}

但在当时,void 关键字只能用于修饰函数返回值,不能声明任何变量。因为编译器根本不知道一个 void 类型的变量应该占几个字节。所以当时有人调侃说:“void存在的唯一意义,就是告诉你这里啥也没有

至于 void 能否用来声明指向未知类型的指针”---那是十年后ANSI C 标准才解决的问题。我们后面会讲到。

void引入的核心价值:

二、前身:当 char * 被迫身兼数职

 void * 出生之前,语言里并没有一个专门的万能指针类型。那个时代的程序员,用 char * 来充当通用指针。

这就好比你让一个原本只负责装字符的盒子,去装 int、装结构体、装一切东西。

后果是什么?

第一,意图模糊。当你看到一个 char * 类型的变量时,你根本不知道它到底是指向一个字符串,还是指向一块任意类型的内存。代码的可读性大打折扣。

第二,类型不安全。因为 char * 被当成了万能钥匙,编译器无法区分我真的想操作字符我只是在传递一个通用地址。你没法写一个只接收字符指针的函数,因为 char * 已经被泛型用途给污染了。

第三,malloc 的尴尬。最典型的例子就是 malloc。在那个年代,malloc 的返回值是 char *。这就意味着,每当你分配一块内存:

int *p=(int*)malloc(100*sizeof(int)); //必须强转!

如果不强转,编译器就会报错。

更要命的是,如果你把 int *p 改成 double *p,所有相关的强制转换都得跟着改---改漏一个,就是一个隐蔽的 bug

三、诞生:被出来的万能指针

1970年代末,贝尔实验室。

一场技术交流会的酒会上,两位 C 语言的核心开发者---Steve Johnson  Charlie Roberts---正靠在吧台边,一边喝酒一边聊着一个让他们头疼了很久的问题:

有没有一种方式,可以让指针只负责传递地址,而不携带类型信息?

那个年代,char * 被用来充当万能指针,但正如前面所述,这带来了严重的意图模糊和类型安全问题。程序员需要一个专门的类型来表示只是一个地址,不关心它指向什么类型

就在这时,Charlie Roberts 突然露出了一个笑容。他提出了一个想法,让 Steve Johnson 后来形容为一个近乎字面意义上的灵光一现being struck by an idea。那个想法是:

嘿!我们为什么不引入一种通用的void *类型呢?它只用来传递地址,不携带任何类型信息。

于是,void *的想法诞生了。

这个想法后来被 ANSI C 委员会采纳,在 1989 年的 C89 标准中被正式标准化。malloc 也随之改为返回 void *,无需再手动强制转换。

ANSI C 委员会在设计 void * 时,有两个核心目标:

目标一:区分泛型指针字符指针

以前你分不清一个 char * 到底是指向字符还是指向任意类型。有了 void *,这个问题一目了然。

目标二:让编译器帮你检查错误。

void *不能被直接解引用,也不能做指针运算。如果你试图对 void *  *p  p++,编译器会直接报错。

这一点在当时是革命性的---它让编译器从被动的翻译工具变成了主动的安全检查员

四、成长:三大关键设计决策

void *的成长过程中,有几个关键设计决策决定了它今天的模样。

决策一:和 char * “长得一样

ANSI C 标准规定:char *  void * 必须具有完全相同的内存表示identical representations)。

为什么?

 void * 出现之前,char * 已经是事实上的万能指针”---malloc 返回 char *,所有泛型操作都用 char *

如果 ANSI 突然规定 void *  char * 长得不一样,那所有依赖 char * 做泛型指针的老代码都会出问题。所以委员会做了一个务实的决定:

既然 void *  char * 干的是一样的活儿,那就让它们长一样的尺寸。

这个决策的结果是:所有指针变量,在 64 位系统下都占 8 字节,在 32 位系统下占 4 字节。

int *p;// 64位下占 8 字节

char *q;// 64位下占 8 字节

double *r;// 64位下占 8 字节

void *s;// 64位下占 8 字节

void **t;// 64位下占 8 字节

不管是一级指针还是二级指针,不管指向什么类型,指针变量本身的大小是固定的---它存的就是一个地址值。

决策二:禁止 void * 算术运算

委员会做了一个非常重要的决定:禁止对 void *做指针算术运算

理由是:void * 指向的是未知类型的对象,编译器不知道它指向的对象有多大。如果你写 p + 1,编译器根本不知道应该偏移几个字节。

如果真的需要做字节级别的偏移,你应该先把 void * 强转成 char *

决策三:void * 可以隐式转换

 C 语言中,void * 可以隐式转换成任何类型的对象指针。这意味着:

int *p = malloc(100);// 不需要强转!

这在 C++ 中是不允许的---C++ 要求必须显式强转。这也是为什么很多 C++ 程序员会习惯性地对 malloc 做强制转换,而在 C 语言中这其实是多余的。

五、成年:void ** 真身

说完了 void *,我们再来看 void **

void **是什么?

简单说:它是一个指向 void *的指针

它不是什么神秘的东西---它就是一个二级指针,占 8 字节(64 位系统),里面存的是一个 void * 变量的地址。

void **为什么存在?

因为 C 语言是值传递。如果你想在一个函数内部修改外部的 void * 变量,你必须传入这个变量的地址---也就是 void **

这是 void ** 最核心、最常用的场景。

void **在工程中怎么用?

最典型的例子是不透明句柄opaque handle)模式:

// 调用者只需要一个void* 来保存句柄,不需要知道句柄内部是什么intOpenDevice(void **ppHandle, int id) {struct DeviceHandle *h = malloc(sizeof(struct DeviceHandle));if (!h) return -1;*ppHandle = h;   // 把句柄“带出去”return 0;}intmain() {void *handle = NULL;OpenDevice(&handle, 123);   //传入 handle 的地址 // handle 现在指向了有效的设备句柄}

调用者只知道我有一个 void * 句柄,完全不需要知道它指向的到底是什么结构体。这正是 void ** 的精髓---它让函数可以输出一个不透明指针,同时隐藏了所有实现细节

一句话总结void **

void *盲盒void **盲盒的地址”---用来让别人帮你往盲盒里塞东西。

六、用途:void * 到底解决了什么问题?

用途:泛型编程

如果没有 void *,每个通用函数都需要为每种类型单独写一份:

// 没有 void * 的噩梦:voidswap_int(int *a, int *b) {   int t = *a;   *a = *b;   *b = t; }voidswap_float(float *a, float *b) {   float t = *a;   *a = *b;   *b = t; }// ... 每种类型都要写一遍!

有了 void *,一个函数通吃所有类型:

voidswap(void *a, void *b, size_t size){char tmp[size];memcpy(tmp, a, size);memcpy(a, b, size);memcpy(b, tmp, size);}// 调用:不管什么类型,一个函数搞定int x=1, y=2swap(&x, &y, sizeof(int));double d1=1.5, d2=2.5swap(&d1, &d2, sizeof(double));

用途:封装与信息隐藏

这是 void * 最被低估的价值:

// 头文件(对外公开)—— 调用者只看到 void*typedef void *DeviceHandle;DeviceHandle open_device(int id);intread_data(DeviceHandle handle, char *buf, int len);voidclose_device(DeviceHandle handle);// 实现文件(不对外公开)——真正的结构体藏在 .c 文件里struct DeviceHandleImpl {int fd;char name[64]; // ... 各种内部状态};

调用者只需要保存这个句柄,不需要知道它内部长什么样。用 void * 强制实现了信息隐藏

用途:与 malloc / free 体系协同工作

malloc返回 void *free 接收 void *。这是 C 语言内存管理的基础设施。如果 malloc 返回 int *,那分配 char 数组或结构体时怎么办?void * 保证了内存分配函数只负责给地址,不关心怎么用

七、回归笔试:用前世今生秒懂两道题

现在,我们把整个故事串起来,回到开篇的两道笔试题。

1题:为什么 void * 不能直接解引用?

记住一个原则:void *里面存的是一个地址值,但编译器不知道这个地址指向什么类型。

int a = 10;void *p = &a;

【注】变量p是按64bit的8字节举例;0x100/0x200地址 只是举例说明;下同。

错: *p 直接解引用 → 编译器不知道读几个字节 → 编译报错;

正确: (int*)p 告诉编译器这是 int 的地址”→ *  4 字节 → 得到 10;

错: *p 本身非法;

错: (int)p 是取 p 里存的地址值(0x100)当整数打印,不是 10;

2题:为什么必须传&ptr

记住一个原则:语言只有值传递,形参是实参的拷贝。

voidAllocMemory(void **pp, int size){*pp = malloc(size);}
&ptr 是 ptr 的地址,类型是 void **。传入后,形参 pp 指向外部的 ptr
*pp = malloc(100) 修改了pp 指向的变量,即外部的ptr。

图解:

调用 AllocMemory(&ptr, 100) 时:

执行 *pp = malloc(100) 之后:

如果传ptr

AllocMemory(ptr, 100);//传入的是NULL

 形参 pp 得到的是 NULL 的拷贝,修改 pp 不影响外部的 ptr

所以正确答案是 D:应填&ptr,返回后 ptr 指向堆上的 100 字节内存。

八、家谱:一张图看懂 void * 家族

写在最后:void * 人生哲学

回顾 void * 的整个成长历程,你会发现它身上有一种独特的哲学

它知道自己不知道

void *最聪明的地方,就是它知道自己不知道自己指向的是什么类型。它不假装自己懂,不试图做它不该做的事(解引用、算术运算)。它只做一件事---老老实实地当一个地址的搬运工

正因为它知道自己不知道,它才成为了 C 语言里最通用、最灵活的类型。

 void ** 则更进一步---它连盲盒都不直接给你,而是给你盲盒的地址,让你可以在函数里往盲盒里塞东西。

一句话记住它们:

void *盲盒”---什么都能装,但不能直接拆。void **盲盒的地址”---用来让别人帮你往盲盒里塞东西。所有指针的本质都一样:字节空间(64bit系统),存一个地址值。

回到开篇两道题:

1题选 B---先强转再解引用。

2题选 D--- &ptr,返回后 ptr 指向堆上的 100 字节内存。

这两道题背后的道理,就是上面整个故事讲的所有内容。理解了这个故事,你永远不会再被 void *  void ** 搞晕。

关于作者:某公司嵌入式底软面试官,根据近期招聘应届生的C语言笔试反馈,总结一些 共性的问题,分享一下。回想自己刚毕业的时候,也是一样搞不清楚,逐步啃《C缺陷与陷阱》、《C专家编程》 等C语言经典书籍,才逐步入门。。。因此,花点时间写个笔记,抛砖引玉,希望有需要的人少点弯路。不够严谨的地方也欢迎留言指正。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-10 16:25:14 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/902674.html
  2. 运行时间 : 0.228645s [ 吞吐率:4.37req/s ] 内存消耗:4,799.75kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=dea417ebe5a40b1068108c1de7e81ad4
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 4.22 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.11 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001187s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001557s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000719s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000624s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001214s ]
  6. SELECT * FROM `set` [ RunTime:0.000583s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001528s ]
  8. SELECT * FROM `article` WHERE `id` = 902674 LIMIT 1 [ RunTime:0.001201s ]
  9. UPDATE `article` SET `lasttime` = 1786350314 WHERE `id` = 902674 [ RunTime:0.001630s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000679s ]
  11. SELECT * FROM `article` WHERE `id` < 902674 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001176s ]
  12. SELECT * FROM `article` WHERE `id` > 902674 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002248s ]
  13. SELECT * FROM `article` WHERE `id` < 902674 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002272s ]
  14. SELECT * FROM `article` WHERE `id` < 902674 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005337s ]
  15. SELECT * FROM `article` WHERE `id` < 902674 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.016900s ]
0.233723s