Вам разрешено изменять argc
и argv
, но это не значит, что C внезапно обрабатывает (пере) распределение этих переменных для вас. argv
будет массивом типа char* argv[argc];
. Он будет содержать столько указателей, сколько argc
говорит, что он содержит, не больше, не меньше. Точно так же длина каждой строки, на которую указывает argv[i]
, равна длине, которую передал вызывающий.
Пример:
myprog.exe foo
argc == 2
и argv
будут иметь длину 2. Это не может быть изменено вашей программой. argv[0]
будут указывать на модифицируемую строку "myprog.exe"
, размер 10 + 1 = 11 байтов. Вы можете изменить содержимое, но не хранить в нем ничего длиннее 11 байт. argv[1]
будет указывать на строку "foo"
, размер 3 + 1 = 4 байта. Вы можете изменить содержимое, но не хранить там ничего длиннее 4 байт. (Любопытство: это совершенно нормально и, пожалуй, самый правильный способ определить argv
как VLA следующим образом:
int main (int argc, char* argv[argc])
, потому что argv
распадается на char**
в любом случае.)
То, что все сказанное, изменение argc
и argv
, хотя и допускается стандартом C, является ужасно плохой практикой. Не делай этого. Вместо этого вы должны использовать локальную переменную и позволить ей ссылаться на argv
, где это необходимо. Пример:
int main (int argc, char* argv[])
{
const char* argstr [12] =
{
"str0",
"str1",
"str2",
"str3",
"str4",
"str5",
"str6",
"str7",
"str8",
"str9",
"str10",
"str11",
};
for(int i=0; i<argc; i++)
{
argstr[i] = argv[i];
}
/* always use argstr here, never argv */
return 0;
}
Этому всегда рекомендуют никогда, пагубно уничтожают существующий путь к классу, если у Вас нет серьезного основания.
Следующая строка сохраняет существующий путь к классу и добавляет на него.
export CLASSPATH="$CLASSPATH:foo.jar:../bar.jar"
Мне не нравится установка CLASSPATH. ПУТЬ К КЛАССУ является глобальной переменной и как таковой, это является злым:
Поэтому предпочтительный путь состоит в том, чтобы установить путь к классу на каждое выполнение jvm, например:
java -Xmx500m -cp ".:../somejar.jar:../mysql-connector-java-5.1.6-bin.jar" "folder.subfolder../dit1/some.xml
Если это становится длинным, стандартная процедура должна перенести его в удар или сценарий пакетной обработки для сохранения ввода.
Пути в соответствии с Linux разделяются двоеточиями (:
), не точки с запятой (;
), как theatrus правильно использовал его в его примере. Я полагаю, что Java уважает эту конвенцию.
Кроме того, к тому, какой предложенный andy, можно использовать следующую форму (который устанавливает ПУТЬ К КЛАССУ на время команды):
CLASSPATH=".:../somejar.jar:../mysql-connector-java-5.1.6-bin.jar" java -Xmx500m ...
какой бы ни более удобно для Вас.