Visual Studio C ++ 2010 как __argv может быть нулевым указателем? - PullRequest
1 голос
/ 17 марта 2012
int _tmain(int argc, _TCHAR* argv[])
{

    if (argc != 3) {
        printf("Format is straightline.exe <EO records file> <output file>");
        return 1;
    }
    string eoPath = string(__argv[1]);
    //...other stuff ...
}

Если __argc == 3, как __argv может быть нулевым указателем?

Мой отладчик говорит мне, что __argv указывает на 0x00000000 после сбоя программы, когда я пытался сослаться на __argv[1] (и я подтвердил, что __argc == 3).Это минимальная программа, и это произошло в начале, до того, как я выполнил какую-либо обработку.

Ответы [ 3 ]

4 голосов
/ 17 марта 2012

Если это выполняется как Unicode, тогда <code>__argv будет нулевым, а <code>__wargv будет содержать то, что вы хотите. Я считаю, что существует <code>__targv, который должен содержать аргументы командной строки независимо от Unicode или ASCII.

Но зачем использовать любое из них, если вы можете просто использовать argv, переданный в качестве параметра _tmain?

2 голосов
/ 17 марта 2012

Указатель на __argv может (и будет) быть null в конфигурациях Unicode.

1 голос
/ 17 марта 2012

__argc, __argv / __wargv и __envp / __wenvp - это специальные глобальные переменные, используемые в инициализации CRT, их не следует трогать, просто придерживайтесь переменных, передаваемых в main / wmain / _tmain, они получены из вышеупомянутых глобальных переменных, и они гарантированно будут правильными, и благодаря макросам Microsoft для варианта _tmain они также будут использовать правильную кодировку символов (UNICODE против MBCS / ASCII).

...