Portál AbcLinuxu, 26. dubna 2024 20:57


Dotaz: C a getopt

5.11.2010 22:19 Jozef G
C a getopt
Přečteno: 804×
Odpovědět | Admin

Dobry den, dalsia otazka z mojej strany :)

int c; char* str;

while ((c=getopt(argc, argv, "hl:")) != -1) {
switch (c) {
case 'l': str = malloc(strlen(optarg));
strcpy(str, optarg);
break;
default: usage();
return 0;
}

Pokial spustim program ./test alebo ./test nieco_bez_pomlcky, tak dostanem segmentation fault. Ak zadam ./test -nieco, tak to funguje spravne. Je toto standardne spravanie getopt, alebo mam ja nieco zle?

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

5.11.2010 22:37 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C a getopt
Odpovědět | | Sbalit | Link | Blokovat | Admin

Nevím, jestli tam není ještě jiný problém, ale určitě máte chybu v alokaci paměti - na řetězec potřebujete alokovat o jeden byte víc, než je jeho délka (nebo rovnou použít strdup()). A také tam nikde nevidím, že byste tu paměť vracel, ale to samozřejmě segfault nezpůsobí.

Ale váš problém bude asi někde jinde než v tomhle kusu kódu, protože v případech, kdy vám to segfaultuje, byste se do této větve vůbec neměl dostat. Zkuste si to pustit v debuggeru a uvidíte přesně, kde vám to padá.

5.11.2010 22:52 Jozef G
Rozbalit Rozbalit vše Re: C a getopt
Nj to je vidiet, ze robim hlavne C++, v tom stringu mi chyba miesto na ukoncovaciu nulu, ale pamat samozrejme uvolnujem dalej v kode. Problem je, ze getopt zomrie skor ako stihne nieco spravit.
5.11.2010 23:03 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C a getopt

Jak říkám, problém bude někde jinde. Buď si to pusťte v debuggeru nebo sem dejte ten zdrojá celý (jako přílohu).

Ještě praktická poznámka: na ukázky kódu používejte element pre, je to přehlednější.

6.11.2010 00:18 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: C a getopt
Odpovědět | | Sbalit | Link | Blokovat | Admin
Neinicializová proměnná str (v případě, že v parametrech není žádné -l)?
6.11.2010 00:38 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C a getopt
V tom případě se do té větve vůbec nedostane.
6.11.2010 16:16 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: C a getopt
Jo, pravda, ale i pokud dostane, je celá proměnná str dost na houby. Dokud se tazatel neuráčí poskytnout větší část zdrojového kódu, těžko mu jinak radit.

Taky není kontrolována návratová hodnota malloc. I když na tom to zde selhávat asi nebude.
6.11.2010 09:10 mato
Rozbalit Rozbalit vše Re: C a getopt
Odpovědět | | Sbalit | Link | Blokovat | Admin
ak ratam, ze si zabudol len chybou copy-paste zobrat aj } na uzavretie cyklu, tak mne to funguje v poriadku (fbsd)

tak ako ti bolo povedane, skompiluj to s -g option-ov, spusti to a po segfaultovani spust gdb ./test test.core a gdb command where ti povie, kde nastal problem

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.