我需要打印环境的最后一个地址。
我知道我可以得到这个第一个地址(或者我认为我做了)。
extern char **environ; printf("first address %pn",&(*environ));
但是最后的地址呢?
multithreading – 每个内核的线程数
试用C – 为什么我不能分配和使用2GB的内存?
包含path在使用pathvariables时不扩展
如何以编程方式判断两个variables是否在同一个栈上? (在Windows中)
JsonCpp模糊过载只在Windows中
如何心跳X11屏幕保护程序?
我的debugging器似乎运行不同的代码比我build立
简单的shell程序unix文件redirect非内置命令
在Linux系统中,如何直接处理来自字符设备/游戏手柄的input?
man environ是一个很好的起点。
char **pp = environ; for( ; *pp; pp++) { printf("%sn",*pp); } printf("The end of environ is %pn",pp);
将打印出环境变量; 我相信他们是在“名称=价值”的形式。
询问最后一个看起来很奇怪,因为它们没有特定的顺序,除非它们在shell中被设置的顺序。
通常,如由environ(7)所记录的 , environ数组以NULL指针结束。
实际上,内核在一个execve(2)之后建立一个进程的初始堆栈,并且环境在该初始堆栈上传递,结尾为NULL 。因此,这个约定的一部分是在内核中按照应用程序二进制接口来实现的 。约定的另一部分是在启动例程中执行的,它是可执行文件的入口点,在crt*.o中调用main和setting environ 。
所以你只需要像Charlie Burns的答案那样做一个循环来找到它的结尾,例如
char** environ_end; for (environ_end = environ; *environ_end != NULL; environ_end ++) {}; // at this point,environ_end points to the end of the environment // ie to the ending NULL entry there.
如果environ数组是NULL终止的(如main()第三个参数)
extern char **environ; int i = 0; while (environ[i] != NULL) { printf("environ[%d] = %pn",i,environ[i]); i++; } // environ is a "pointer to pointer to char". See http://cdecl.org/ // The last useful pointer in array `environ` should be a NULL. printf("last address(or pointer) of the environment = %pn",environ[i]); // The address(pointer) of that last pointer(pointer) is ... printf("address of the last address of environ = %pn",&environ[i]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。