首页 > 解决方案 > 在 C 中返回 WCHAR[]

问题描述

我有以下用 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)

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

标签: cwinapimingw

解决方案


您不能返回局部变量的地址,您会收到编译器警告(实际上更多的是错误)。

你要这个:

#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(如 in var[256])可能还不够。我将其作为练习留给您正确解决此问题。


推荐阅读