| | |
| Stránka: 1 z 1
| [ Príspevkov: 20 ] | |
Autor | Správa |
---|
Registrovaný: 02.12.06 Prihlásený: 23.03.24 Príspevky: 690 Témy: 35 Bydlisko: Rimavská So... | Napísal jarrro: 24.03.2016 23:12 | |
|
Ahoj da sa v Cecku pred kompilaciou zistit aky je naozajstny pocet argumentov? v argc je t len pocet argumentov zadanych pri spusteni +1 pricom 0.ty je cesta s akou sa programspustil. Niekedy vsak shell ulozi do dalsich argumentov udaje o systems a podobne da sa to zistit pred kompilaciou ci si programator moze dovolit argv[argc] a viac bez segmentation fault resp. crash?
_________________ Math is the best! |
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | Napísal chrono: 24.03.2016 23:27 | |
|
Shell nikdy nič do argv neukladá a v argc je počet platných elementov (tie údaje tam dáva štandardná knižnica a tá sa postará o to, aby boli tie údaje správne).
Technicky je posledný parameter argv[argc-1] (pretože sa čísluje od 0), každopádne dá sa použiť aj argv[argc] bez toho, aby program spadol (pretože to pole obsahuje o jeden prvok viac a ten je vždy NULL).
PS: A pri kompilácii ani pred ňou sa počet parametrov zistiť nedá (pretože to má zmysel len pri spustenom programe).
|
|
Registrovaný: 02.12.06 Prihlásený: 23.03.24 Príspevky: 690 Témy: 35 Bydlisko: Rimavská So... | Napísal autor témy jarrro: 24.03.2016 23:36 | |
|
Tak neviem ci shell ci kernel ci terminal ci priamo kompilator,ale nieco to tam v linuxoch uklada skus v debian-like spustit program bez parametrov ktory vypisuje parametre v cykle na debiane vo virtualboxe to spadlo az pri indexe 40 pricom null sa striedalo s NAZOV=hodnota
_________________ Math is the best! |
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 25.03.2016 0:26 | |
|
To, že ti to spadne až na 40. prvku je náhoda, nie zámer. To pole je proste veľké presne argc položiek (+null). Všetko za je bordel v pamäti.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 02.12.06 Prihlásený: 23.03.24 Príspevky: 690 Témy: 35 Bydlisko: Rimavská So... | Napísal autor témy jarrro: 25.03.2016 10:20 | |
|
tak asi to pridáva aj terminál, lebo zmenil som xterm či ako sa to volá čo je v xfce za terminator a začalo to padať až na indexe 44 a nekompiloval som znovu, ale keď som to pustil znovu na tom istom terminály tak bol ten istý výstup iba keď som zmenil priečinok cez cd tak pribudol jeden argument OLDPWD=starypwd
_________________ Math is the best! |
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | Napísal chrono: 25.03.2016 10:33 | |
|
To tvrdíš, že v argc si mal 44 alebo dokonca väčšie číslo?
|
|
Registrovaný: 02.12.06 Prihlásený: 23.03.24 Príspevky: 690 Témy: 35 Bydlisko: Rimavská So... | Napísal autor témy jarrro: 25.03.2016 10:42 | |
|
nie v argc bolo 1 ako treba,ale v argv boli aj iné veci ako cesta ku programu Kód: #include <stdio.h> #include <stdlib.h>
int main(int argc, char **argv){ for(int i=0;i==i;i++){ printf("%d. argument je : %s\n", argc+i, argv[argc+i]); } return 0; }
tento kód spadne až pri i>40
_________________ Math is the best! |
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 25.03.2016 11:01 | |
|
Ten kód náhodou spadne až pri i>40. U mňa na Windows to spadne už na 1. A keď to spustíš na inom stroji, nemusí to spadnúť vôbec. Ešte raz: Pole je veľké argc prvkov. Všetko ďalej je bordel v pamäti. Urob toto Kód: char * a = (char *)malloc(1); a urob rovnaký cyklus. A sleduj.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 02.12.06 Prihlásený: 23.03.24 Príspevky: 690 Témy: 35 Bydlisko: Rimavská So... | Napísal autor témy jarrro: 25.03.2016 11:11 | |
|
ja viem, že to vo windows spadne hneď preto som sa pýtal či sa to kódom nedá zistiť pred kompiláciou teda či je aspoň teoreticky možné spraviť funkciu SF Kód: int (SF(int i,int j,char **argv)){ return (argv[i][j]sposobi segfault); } samozrejme bez sposobenia segfault
_________________ Math is the best! |
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 25.03.2016 11:16 | |
|
Tu máš takú funkciu: Kód: int SF( argv, argc, i ) { return i > argc; }
To, že ti to nespadne neznamená, že je to volanie správne, ale - ešte raz zdôrazňujem - že je to NÁHODA. Volať prvok za hranicou pola je vždy zle.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | Napísal chrono: 25.03.2016 11:17 | |
|
Nie, zistiť sa to nedá. Ak chceš, aby program padol, stačí, ak budeš čítať z adresy 0 a ak nechceš, aby spadol, čítaj len toľko položiek, koľko ich v argv je.
|
|
Registrovaný: 02.12.06 Prihlásený: 23.03.24 Príspevky: 690 Témy: 35 Bydlisko: Rimavská So... | Napísal autor témy jarrro: 25.03.2016 11:44 | |
|
BX píše: Ten kód náhodou spadne až pri i>40. U mňa na Windows to spadne už na 1. A keď to spustíš na inom stroji, nemusí to spadnúť vôbec. Ešte raz: Pole je veľké argc prvkov. Všetko ďalej je bordel v pamäti. Urob toto Kód: char * a = (char *)malloc(1); a urob rovnaký cyklus. A sleduj. díky dokonca to spadlo až na i=135152
_________________ Math is the best! |
|
Registrovaný: 24.08.12 Prihlásený: 09.02.19 Príspevky: 59 Témy: 0 | Napísal faraon: 26.03.2016 6:54 | |
|
jarrro píše: tak asi to pridáva aj terminál... Argumenty se předávají pomocí zásobníku, takže to co prohrabáváš jsou záznamy předchozí činnosti, které budou ještě potřeba. Po spuštění programu totiž proběhne řada kroků, které pro něj připravují prostředí, a teprve potom se zavolá funkce main(). Pokud tam zkusíš něco změnit a půjde to, můžeš shodit nejenom svůj program, ale s trochou štěstí (nebo smůly) i systém. Při ukončení program po sobě zase uklidí, pomocí těch údajů na zásobníku, to jsou věci které se dělají automaticky a programátor se o ně nemusí vůbec starat, maximálně tam pomocí atexit() něco přidá.
_________________ "Existuje pouze jeden člověk, který má méně přátel než Bill Gates, a tím je Saddám Husajn." (Paul Grayson) |
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | Napísal chrono: 26.03.2016 10:14 | |
|
Funkcia main môže mať, na niektorých systémoch, aj tvar main(int argc, char **argv, char **envp), a štandardná knižnica dá do envp premenné prostredia. Pri niektorých implementáciách štandardnej knižnice sa môže stať, že tie premenné sú uložené hneď za argv (ale môžu byť uložené aj úplne inde).
|
|
Registrovaný: 14.03.11 Prihlásený: 02.08.23 Príspevky: 814 Témy: 23 Bydlisko: Bratislava |
jarrro píše: nie v argc bolo 1 ako treba,ale v argv boli aj iné veci ako cesta ku programu Kód: #include <stdio.h> #include <stdlib.h>
int main(int argc, char **argv){ for(int i=0;i==i;i++){ printf("%d. argument je : %s\n", argc+i, argv[argc+i]); } return 0; }
tento kód spadne až pri i>40 for(int i=0;i==i;i++){ Čo má robiť i==i ? Ako sa to dostane na 40? Podľa mňa to skončí hneď (sory, bol som dlho PN a ešte mi asi hlava nefunguje).
|
|
Registrovaný: 22.08.11 Prihlásený: 14.12.23 Príspevky: 2361 Témy: 11 | Napísal magic: 19.04.2016 15:17 | |
|
i==i plati vzdy, takze to moze len zhodit OS, ked budes strkat prsty do pamate, co nie je tvoja. //to som ale Captain Obvious
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 19.04.2016 19:36 | |
|
Zhodiť OS v dnešnej dobe takýmto cyklom? To musíš púšťať na poriadne starom systéme.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 22.08.11 Prihlásený: 14.12.23 Príspevky: 2361 Témy: 11 | Napísal magic: 19.04.2016 19:37 | |
|
Nie, nie, zle som to napisal. OS zhodi program. Nie program OS.
|
|
Registrovaný: 02.12.06 Prihlásený: 23.03.24 Príspevky: 690 Témy: 35 Bydlisko: Rimavská So... | Napísal autor témy jarrro: 19.04.2016 21:11 | |
|
marian_r píše: jarrro píše: nie v argc bolo 1 ako treba,ale v argv boli aj iné veci ako cesta ku programu Kód: #include <stdio.h> #include <stdlib.h>
int main(int argc, char **argv){ for(int i=0;i==i;i++){ printf("%d. argument je : %s\n", argc+i, argv[argc+i]); } return 0; }
tento kód spadne až pri i>40 for(int i=0;i==i;i++){ Čo má robiť i==i ? Ako sa to dostane na 40? Podľa mňa to skončí hneď (sory, bol som dlho PN a ešte mi asi hlava nefunguje). je to len nekonečný for cyklus aby som mal riadiacu premennú to isté by spravilo Kód: int i=0; while(1){ printf("%d. argument je : %s\n", argc+i, argv[argc+i]); i++; } každopádne je to (snáď) vyriešené pri vysokých indexoch nepristupujem do argv ale do pamäte za ním, kde sa v niektorých prípadoch nachádzajú zmysluplné informácie, v niektorých nič a v niektorých informácie potrebné pre chod iných programov OS a vtedy to spadne je to tak?
_________________ Math is the best! |
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | |
| Stránka: 1 z 1
| [ Príspevkov: 20 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| zistenie počtu v array v PHP, ASP | 3 | 494 | 27.04.2009 14:23 johny694 | | zistenie poctu id-ciek v PHP, ASP | 5 | 554 | 29.09.2008 17:19 Roko | | Mysql zistenie počtu rôznych záznamov v Databázy | 4 | 782 | 28.12.2008 16:40 Unlink | | Zistenie poctu uzivatelov na webe v PHP, ASP | 20 | 1139 | 18.07.2008 18:15 dulius | | Nastavenie poctu riadkov a poctu znakov vo Word 2007 v Ostatné programy | 0 | 2155 | 26.07.2009 17:57 fista1 | | Vypis argumentov - Csh - UNIX v Assembler, C, C++, Pascal, Java | 0 | 645 | 07.10.2007 16:32 SAmo | | podla poctu vytvorit v PHP, ASP | 9 | 511 | 25.11.2008 16:34 Blackshadow | | resynchronizacia poctu prispevkov v Ostatné | 0 | 831 | 16.08.2007 10:34 Ďuri | | Zmenšovanie počtu premapovaných sektorov v Pevné disky a radiče | 2 | 692 | 18.10.2013 20:14 hanesovic | | Vypis poctu z MySQL v PHP, ASP | 11 | 643 | 30.01.2009 12:39 jtomcik | | Overenie min. poctu suborov v PHP, ASP | 4 | 446 | 29.03.2009 15:45 zaciatocnik | | Nastavenie počtu prístupov na Apache v Webhosting a servery | 11 | 720 | 13.06.2009 12:04 Pablo Montero | | Obmedzenie poctu kopii na tlaciarni v Externé zariadenia | 8 | 598 | 17.04.2018 9:00 unset(array[0]) | | Script na ratanie poctu downloadov? v PHP, ASP | 2 | 1199 | 03.08.2005 19:35 Pekaboo | | Meranie počtu metrov v mobile v Ostatné programy | 5 | 800 | 06.03.2011 20:37 mato59 | | Sledovanie poctu stiahnuti suboru na webe v HTML, XHTML, XML, CSS | 7 | 525 | 08.12.2012 18:10 capricorn7 |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|