Windows malloc问题?

时间:2016-06-11 09:04:32

标签: c++ malloc

在Windows(Visual Studio C ++ 2010)中,我正在尝试执行简单的字符串复制。这是我的代码:

char * filename;
(...)
filename = (char *) malloc(wcslen(argv[(i + 1)]) + 1);
wcscpy((wchar_t *)filename, argv[i + 1]);
wprintf(L"Filename is: %s", filename);

如果我的argv [i + 1]大于14,程序会崩溃。如果它是14或更低,它运行正常。见下文。

C:\Visual Studio 2010\Projects\test\Release>test.exe -f 12345678901234 aa asas asas
First Argument  argv[1]   -f
Argc = 6
Filename is: 12345678901234

这里有什么问题?我错过了什么? 感谢。

2 个答案:

答案 0 :(得分:6)

意识到wcslen()返回字符串中的宽字符数,而不是它占用的字节数。并且malloc()需要多个字节......

因此,您需要将宽字符的数字乘以宽字符的 size ,然后再将其传递给malloc()

filename = (char *) malloc( (wcslen(argv[(i + 1)]) + 1) * sizeof(wchar_t));

但是,然后,您将其版式转换为(char *)。如果argv被声明为char *argv[]char **argv,那么wcslen()无论如何都会使用错误的函数:您需要strlen()

答案 1 :(得分:3)

如果您使用的是C ++,那么可以使用C ++方式,即

转储

char * filename;
(...)
filename = (char *) malloc(wcslen(argv[(i + 1)]) + 1);
wcscpy((wchar_t *)filename, argv[i + 1]);
wprintf(L"Filename is: %s", filename);

并将其替换为

std::wstring filename = argv[i+1];
wcout << L"FIlename is: " << filename;

main

取代
wmain( int argc, wchar_t *argv[ ]);