Portál AbcLinuxu, 10. května 2025 05:24
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?
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á.
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ší.
str
(v případě, že v parametrech není žádné -l
)?
malloc
. I když na tom to zde selhávat asi nebude.
}
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
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.