【问题标题】:return WCHAR[] in C在 C 中返回 WCHAR[]
【发布时间】:2021-11-27 16:30:05
【问题描述】:

我有以下用 C 语言编写的代码:

#include <windows.h>
#include <stdio.h>

WCHAR* test(){
    WCHAR var[256];

    int nSize = GetEnvironmentVariableW(L"SystemRoot", NULL, 0);
    GetEnvironmentVariableW(L"SystemRoot", &var, nSize);

    wprintf(L"%s\n", var);

    return var;
}

int main() {
    WCHAR* var = test();
    wprintf(L"%s\n", var);
    return 0;
}

当我在 Visual Studio 中编译并运行它时,它按预期工作。它打印结果两次 - 在主函数和测试中。输出是:

C:\Windows
C:\Windows

但是当我通过命令使用mingw编译器在linux上编译它时

i686-w64-mingw32-gcc -o test.exe -O3 -Os -static -s test.c

它在启动后给出这个输出:

C:\Windows
(null)

为什么在我使用 mingw 时 test() 函数返回 NULL 以及如何使其正常工作? 谢谢。

【问题讨论】:

  • var指向的数组是一个局部变量,离开函数后就不存在了,所以返回没有意义。您在这里有未定义的行为。它似乎可以在 Windows 上运行纯属偶然。
  • 您是否阅读了编译器在编译此代码时向您显示的警告?
  • 除了上述 cmets 之外,如果该环境变量超过 255 个字符,则可能会导致缓冲区溢出。您应该根据GetEnvironmentVariableW(L"SystemRoot", NULL, 0) 返回的大小分配缓冲区,或者不要调用GetEnvironmentVariableW(L"SystemRoot", NULL, 0),而是在调用GetEnvironmentVariableW(L"SystemRoot", &amp;var, /* actual buffer size here */) 时传入实际的缓冲区大小。

标签: c winapi mingw


【解决方案1】:

你不能返回一个局部变量的地址,你会得到一个编译器警告(这实际上是一个错误)。

你想要这个:

#include <windows.h>
#include <stdio.h>

WCHAR* test(WCHAR var[], int nSize) {
  GetEnvironmentVariableW(L"SystemRoot", var, nSize);
  wprintf(L"%s\n", var);
  return var;
}

int main() {
 // declare var outside the test function
  WCHAR var[256];

  // pass the address of var to test
  test(var, 256);

  wprintf(L"%s\n", var);
  return 0;
}

但请注意,256(如var[256])可能还不够。我将其作为练习留给您正确解决此问题。

【讨论】:

  • 这行得通。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 2012-11-01
  • 1970-01-01
  • 2013-07-24
  • 2013-02-02
  • 2011-06-17
相关资源
最近更新 更多