2015-09-19 3 views
0

Итак, я пытался получить доступ к аргументам командной строки с индексами, большими, чем argc в C++ (потому что почему бы и нет), и обнаружил, что на самом деле есть некоторые параметры, переданные программе. Следующий код выдает следующий результат в моей Ubuntu 14.04:C++ argv индексы больше argc

#include <cstdio> 
int main (int argc, char** argv) { 
    for (int i=argc+1; argv[i]!=0; i++) 
     printf("%3d %s\n", i, argv[i]); 
} 

Это выход:

2 XDG_VTNR=7 
    3 LC_PAPER=tr_TR.UTF-8 
    4 LC_ADDRESS=tr_TR.UTF-8 
    5 XDG_SESSION_ID=c2 
    6 XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/kubuzetto 
    7 SELINUX_INIT=YES 
    8 LC_MONETARY=tr_TR.UTF-8 
    9 CLUTTER_IM_MODULE=xim 
    (and so on) 

Что это и это дистрибутив-зависимое?

+2

Это называется ** неопределенным поведением **. Это универсально. –

+1

@kubuzetto Знаете ли вы, что * неопределенное поведение * означает? – melpomene

+0

Кроме того, это похоже на то, что переменные окружения размещаются после аргументов командной строки в памяти. – melpomene

ответ

2

Не пропустите мимо argc, он не определен.

В этом случае мы знаем, что произошло. Вы видите, основной() объявляется и называется

extern int main(int argc, char **argv, char **envp); 

и так случилось, что путь ARGV и envp построены листья envp сразу после ARGV, так убегал конец встречи envp.

Это может измениться когда-нибудь, поэтому не зависеть от этой работы. Если вы хотите зависеть от метода передачи ядра, укажите точку входа ядра непосредственно (это должно быть сделано в asm [или, возможно, голой функции], поскольку это не похоже на вызов функции).

Смежные вопросы