如何打印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]);
同虚拟地址输出不同值的原因
你看到的地址是进程虚拟地址,不是实际的物理内存地址,每个进程都有独立的虚拟地址空间,同一虚拟地址在不同进程中会映射到不同的物理内存位置:
fork()创建子进程时,操作系统会复制父进程的虚拟地址空间布局,因此全局变量mat在父子进程中的虚拟地址完全一致,属于正常现象。- Linux等系统的
fork()采用**写时复制(Copy On Write)**机制:子进程创建初期和父进程共享同一物理内存页,当任意一方尝试修改内存内容时,操作系统才会为修改方单独分配新的物理页、复制原有内容后再执行修改操作。 - 你的代码中子进程先修改了
mat[1][2]的值,触发写时复制,此时子进程中该元素所在的物理页和父进程完全独立,因此子进程修改为5不会同步到父进程的物理页中,父进程读取到的还是初始值0。
内容的提问来源于stack exchange,提问作者ILoveBitcoin
相关产品推荐
相关产品推荐

