我用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"%sn", var);
return var;
}
int main() {
WCHAR* var = test();
wprintf(L"%sn", var);
return 0;
}
当我在Visual Studio中编译并运行它时,它按预期工作。它在main函数和test函数中打印结果两次。输出:
C:Windows
C:Windows
但是当我在linux上使用mingw编译器通过命令
编译它时i686-w64-mingw32-gcc -o test.exe -O3 -Os -static -s test.c
输出如下:
C:Windows
(null)
为什么test()函数返回NULL当我使用mingw和做什么使它正常工作?谢谢。
你不能返回一个局部变量的地址,你会得到一个编译器警告(这实际上是一个错误)。
你想要这个:
#include <windows.h>
#include <stdio.h>
WCHAR* test(WCHAR var[], int nSize) {
GetEnvironmentVariableW(L"SystemRoot", var, nSize);
wprintf(L"%sn", 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"%sn", var);
return 0;
}
但要注意256(如var[256]
)可能不够。我把妥善解决这个问题留给你作为练习。