- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个用于学习目的的简单程序,我看到了以下行为:
如果我尝试使用 getenv 读取环境变量,它会按预期工作:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("PATH is %s", getenv("PATH"));
return 0;
}
如果我不包含 stdlib.h,我会收到预期的警告:
env.c:7:26: warning: implicit declaration of function ‘getenv’; did you mean ‘getline’? [-Wimplicit-function-declaration]
程序仍然可以编译。运行带有 header 的程序按预期运行,不包含 header 的程序会出现段错误。
如果我检查两个程序的反汇编,我看到有一个对 getenv@PLT 的调用
call getenv@PLT
当我输出 2 个程序的反汇编时(c 源代码中的唯一区别是 header 包含),我看到的唯一区别是当我们包含 header 时有一条指令将 %eax 设置为 0调用 getenv。
movl $0, %eax
如果我在 gdb 中单步执行不包含 header 的程序,它会跳转到 getenv 并在 c 运行时中运行大量代码。
我想知道为什么不在此处包含 header 会导致这种行为的确切原因是什么?为什么 c 让这个编译?
一些信息:gcc 版本 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)我正在这样编译:gcc -O0 -S 环境.c
最佳答案
在C语言中,如果忘记包含头文件,getenv()
函数会被解释为int getenv(...)
。如果包含头文件,getenv()
函数将被解释为 char* getenv(const char*)
。由于 printf()
的实现,您的情况的唯一区别是返回值的大小。如果 sizeof(int) == sizeof(char*)
,则没有问题(这发生在 32 位程序中)。如果 sizeof(int) != sizeof(char*)
,则会出现错误(64 位程序会出现这种情况)。这在评论 #5 中有解释
关于c - 如果不包含 header ,则使用什么 getenv 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57033333/
我正在尝试获取我的程序在终端中运行时的窗口大小。在 Xcode 中,我编辑了方案,以便设置 LINES 和 COLUMNS 环境变量以在 Xcode 中运行,并且它在那里运行良好。但是,当我单击“产品
如果我将常量声明如下,则会收到错误“os.Getenv("MY_SECRET") 中的常量初始化程序不是常量”。这是为什么呢? Go 新手,我看到 Getenv 的返回类型是一个字符串,但我不明白为什
Coverity 声称 getenv 正在返回一个受污染的字符串,我已经用尽了所有返回值检查的想法。我查看了与我类似的其他问题,但他们的解决方案都不适合我。 我已经尝试检查 NULL 的返回值,我已经
在 mac OSX 和 Linux CentOS 中,我使用 .bashrc 和 .bash_profile 插入一个新的系统环境变量(即“MYAPP”)。我什至重新启动了我的笔记本电脑(mac)和我
我有一个 docker 容器,我在 Alpine 之上设置了 PHP 5.6 和 Apache 2.4。在我的 PHP 代码中,我使用了 getEnv读取我作为 docker compose 文件的一
如何处理此类行代码的 NullPointerException 和 SecurityException: public final static String PROJECT_DIR = System
哪个全局变量保存了 getenv() 的所有环境变量?这个变量在哪个 glibc 文件中填充了环境变量? 我相信它是 **environ,但是当我在 bash 中设置环境变量时,它只输出 SSH_AG
我使用 Netbeans 6.9 在 Ubuntu 10.04 中创建了一个独立的 java 应用程序。我无法在 Netbeans 中使用 getenv() 命令,但如果我在 gedit 中创建一个单
getenv() 上的 cplusplus.com 文档状态... The pointer returned points to an internal memory block, whose con
我有一个 JAVA 应用程序,它使用 System.getenv("MY_VAR") 获取系统环境变量。有没有办法只搜索 Windows 系统环境变量而不搜索用户环境变量,类似于我们如何将环境变量目标
我想知道如果我更改从getenv 返回的内存到底会发生什么 我知道这不是一个好的代码。顺便说一下,我知道 setenv。 喜欢: char *new_path = "/home/user/dev/my
我这样设置环境变量: export MY_DIR="$HOME/projects" 然后我想在我的程序中读取该变量: char *name = getenv("MY_DIR"); 但是当我使用 Qt
我在我的代码中多次调用 getenv(调用了很多次),所以我看到了优化的潜力。我的问题是,getenv 是以某种方式在内部缓存结果,还是在每次调用时查询环境变量? 我分析了代码,getenv 不是瓶颈
我的程序使用现有的库,文档有限,我无法控制。出于这个问题的目的,它的使用如下: #include using their_lib::Node; int main ( int argc, char**
我刚刚添加了环境变量“DataDir”,但 getenv 函数仍然返回空值。 这是我的代码:const char *ret = getenv("DataDir"); 我重新启动了我的电脑,它完成了。
我想使用 getenv()功能。 现在有人评论说如果多个线程调用这个函数,这将不是线程安全的。但是,如果我查看 information page对于此功能,它声明: Concurrently call
我必须做功课,但我不能在 C 中学习。例如; int main(void) { char *path; path = getenv("PATH"); if(path) printf
我正在尝试访问我的环境变量之一,即 JAVA_HOME。为此,我使用了 getenv() 函数,如下所示: #include #include int main() { const cha
我正在尝试制作一个 bash 脚本运行的程序。我希望 bash 脚本能够更改 c++ 程序的状态,而我唯一能找到的就是使用环境变量。问题是,getenv 似乎只在程序运行时获取值。 bash expo
在 CLI 模式下 getenv('HOSTNAME') 正确返回 HOSTNAME 环境变量,但在脚本中调用时返回 FALSE。 为什么?如何在脚本中获取 HOSTNAME 变量? 最佳答案 HOS
我是一名优秀的程序员,十分优秀!