2012-07-18 1 views
0

Я хочу изменить старый код C, который принимает входные данные из командной строки , чтобы взять постоянный вектор argv строк, определенный изнутри main.Преобразование argv в статическую строку или ошибку в Visual C++ 2010

я получаю исключение времени выполнения

//void main(ac,av) 
//char *av[]; 
void main() 
{ 
    char *av[]= {"C:\\spice3f5.exe","input.cir","-r","output.txt",0}; 
    char **tv; 
    tv = av; 
    tv++; 
    **tv='-';// "Access violation writing location 0x00708edc." 
    (*tv)[0] = '-';//Same runtime exception 
} 

Это просто не должно было случиться ... Является ли это ошибка в Visual C++ 2010?

+1

@ Ответы timrau в точности верны. Строковые литералы, заключенные в '' ', являются постоянными и хранятся в зависимом от платформы статическом хранилище только для чтения. – Linuxios

ответ

9

Элементы av являются указателями на строковые константы. Таким образом, их изменение приводит к нарушению доступа. Это не ошибка Visual C++.

+0

Чтобы расширить ответ, вы должны были определить const char * av [], тогда компилятор сохранил бы вас до времени выполнения. –

+0

Спасибо Джоша, но почему исходный код Worke затем –

+0

Спасибо Нав. но я не понимаю, Я не думаю, что вы правы, потому что исходный код ниже работы. Это должно также дать нарушение прав доступа, но не силы основных (ас, ау) символ * ау [];. { голец \t ** телевизор; тв = ау; tc = ac; tv ++; \t \t \t ** tv = '-'; Остальная часть кода требует av (= argv), и я должен это Я мог бы предоставить его как постоянный массив строк, внутри main. Но это просто не работает. –