You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打印double pointer(双指针)的地址?fork后同地址输出值为何不同

问题解答

双指针地址的打印方法

你当前用%p打印&mat的写法本身符合语法,你打印的是全局指针变量mat自身的存储地址。如果要打印不同层级的指针地址,参考以下写法:

  • 打印mat变量自身的地址:printf("%p\n", (void*)&mat); (你的原有写法已经实现了该需求,标准C规范要求%p对应的参数为void*类型,添加强转后兼容性更好)
  • 打印mat指向的一级指针数组的首地址:printf("%p\n", (void*)mat);
  • 打印第i个一维数组的首地址:printf("%p\n", (void*)mat[i]);
  • 打印元素mat[i][j]的地址:printf("%p\n", (void*)&mat[i][j]);

同虚拟地址输出不同值的原因

你看到的地址是进程虚拟地址,不是实际的物理内存地址,每个进程都有独立的虚拟地址空间,同一虚拟地址在不同进程中会映射到不同的物理内存位置:

  1. fork()创建子进程时,操作系统会复制父进程的虚拟地址空间布局,因此全局变量mat在父子进程中的虚拟地址完全一致,属于正常现象。
  2. Linux等系统的fork()采用**写时复制(Copy On Write)**机制:子进程创建初期和父进程共享同一物理内存页,当任意一方尝试修改内存内容时,操作系统才会为修改方单独分配新的物理页、复制原有内容后再执行修改操作。
  3. 你的代码中子进程先修改了mat[1][2]的值,触发写时复制,此时子进程中该元素所在的物理页和父进程完全独立,因此子进程修改为5不会同步到父进程的物理页中,父进程读取到的还是初始值0。

内容的提问来源于stack exchange,提问作者ILoveBitcoin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:36:06