2016-06-11 2 views
-3

В Windows (Visual Studio C++ 2010) Я пытаюсь сделать простую строчную копию. Вот мой код:Windows malloc issue?

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

И программа выходит из строя, если мой ARGV [я + 1], если больше, чем 14. Если 14 или меньше он работает нормально. Смотрите ниже.

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

Что здесь есть? Что мне не хватает? Спасибо.

+1

Пожалуйста, решите на языке программирования –

+1

malloc .. * sizeof (wchar_t) ' –

+0

@Olaf - Как вы решили, что это C++. Visual stuio C++ содержит компилятор C –

ответ

6

Поймите, что wcslen() возвращает количество широких символов в строке, а не количество байтов, которое оно занимает. И malloc() требует количества байт ...

Так что вам нужно умножить число широких символов в размере широкого символа перед передачей его malloc():

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

Но тогда вы приписываете его (char *). Если argv объявлен как char *argv[] или char **argv, то wcslen() - это неправильная функция для использования в любом случае: вам нужно strlen().

+0

Почему он не получил предупреждения типа? Действительно ли MSVC++ это плохо (или просто плохие значения по умолчанию)? – Olaf

+0

Спасибо. Извините, все еще учась. Мой argv объявлен как wchar_t. int wmain (int argc, wchar_t * argv []) – flexow

+0

_ @ JohnBurger_ Вам не нужно обращаться к OP именно в каждом посте. Такой считается _noise_. –

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[ ]); 
+0

Зачем вам нужно «filename» - это другое дело, и вопрос остается открытым для читателей. –

+1

'cout <<' должно быть 'std :: wcout <<' – marcinj

+0

Правильно - хорошо видно. –