【问题标题】:getenv in C++ returns wrong valuesC++ 中的 getenv 返回错误值
【发布时间】:2017-12-16 18:14:46
【问题描述】:

我想用 2 条不同的路径编写我的程序。所以,我就这样进行了:

std::string path1 = strcat(std::getenv("APPDATA"),"\\myprog.exe") ;
std::string path2 = strcat(std::getenv("APPDATA"),"\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\myprog.exe") ;

当我打印时,我得到:

C:\Users\thispc\AppData\Roaming\myprog.exe
C:\Users\thispc\AppData\Roaming\myprog.exe\Microsoft\Windows\Start Menu\Programs\Startup\myprog.exe

而不是:

C:\Users\thispc\AppData\Roaming\myprog.exe
C:\Users\thispc\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\myprog.exe

Dietmar Kühl 的解决方案:

std::string path1 = std::getenv("APPDATA") + std::string("\\myprog.exe");

Oliver Charlesworth 的解释: strcat() 改变第一个变量

【问题讨论】:

  • 您显然将第一次调用的结果更改为std::getenv()(我认为这实际上是非法的)。你的意思是写std::string path1 = std::getenv("APPDATA") + std::string("\\myprog.exe");之类的东西吗?
  • strcat 修改第一个参数指向的字符串。这在一般情况下是合法的,但在这种特殊情况下不是 - 您不知道为它分配了多少存储空间。

标签: c++ environment-variables getenv


【解决方案1】:

这里发生的是std::getenv("APPDATA") 为您提供了一个指向内存中某处已写入字符串的指针,这意味着此函数返回的指针将始终相同。

因此,当您执行strcat(std::getenv("APPDATA"),"\\myprog.exe") 时,您基本上会将内存中存储的字符串与"\\myprog.exe" 连接起来。因此,当您第二次调用 std::getenv("APPDATA") 时,您将获得连接的字符串。

要解决这个问题,你应该复制std::getenv("APPDATA")的字符串

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2015-12-28
    • 2015-12-09
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多