Toon posts:

[C++] segmentation fault in atio met getopt

Pagina: 1
Acties:
  • 127 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil command line opties aan mijn programma geven.
Dit programma gebruikte ik als voorbeeld:
http://www.webperf.net/ab.c

Waarom krijg ik een segfault bij atoi ?
skip is een int.

code:
1
2
3
4
5
6
7
8
9
    while ((a=getopt(argc, argv, "sdv:u:f:o")) != EOF) {
        switch (a) {
            case 's':
                printf("optarg:%s\n",optarg);
                skip=atoi(optarg);                            <--------------------- segfault
                break;
            case 'd':
                flags |= FL_DEBUG;
                break;

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Uhm ja en waar wordt optarg gedeclareerd en/of gevuld?

Nevermind, gadver wat een ranzige functie :X

[ Voor 35% gewijzigd door curry684 op 07-09-2004 17:20 ]

Professionele website nodig?


Verwijderd

Volgens je getopt string "sdv:u:f:o" heeft de optie -s geen waarde (er staat geen ':' achter de 's'); het is dan ook niet vreemd dat je applicatie crashed als je die niet-bestaande waarde probeert te benaderen.

  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

Verwijderd schreef op 07 september 2004 @ 15:55:
Waarom krijg ik een segfault bij atoi ?
skip is een int.
Omdat atoi() een vreselijk vieze functie is, en optarg NULL kan wezen. optarg is een afkorting van Optional Argument, wat al aangeeft ie niet altijd een waarde heeft. MAW : error checking.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
igmar schreef op 07 september 2004 @ 18:02:
[...]


Omdat atoi() een vreselijk vieze functie is, en optarg NULL kan wezen. optarg is een afkorting van Optional Argument, wat al aangeeft ie niet altijd een waarde heeft. MAW : error checking.
Een kleine opmerking: Kun je een alternatief noemen ipv atoi? Blijkbaar kent de TS die niet. En om nou een standaard library functie vies te gaan noemen duidt er toch op dat jij het anders zou aanpakken.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

bigbeng schreef op 08 september 2004 @ 13:06:
Een kleine opmerking: Kun je een alternatief noemen ipv atoi?
std::istringstream?

  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

bigbeng schreef op 08 september 2004 @ 13:06:
Een kleine opmerking: Kun je een alternatief noemen ipv atoi? Blijkbaar kent de TS die niet. En om nou een standaard library functie vies te gaan noemen duidt er toch op dat jij het anders zou aanpakken.
Alle functies die niet de mogelijkheid bieden tot errorchecking moet je gewoon niet gebruiken, evenals functies die gewoon domweg strings webschrijven zonder rekening te houden met de lengte.

Wat betreft atoi() : Op zowat alle platformen is strtol() bruikbaar (al heet ie soms _strtol() oid).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

igmar schreef op 08 september 2004 @ 13:23:
Wat betreft atoi() : Op zowat alle platformen is strtol() bruikbaar (al heet ie soms _strtol() oid).
strtol is gewoon ISO C hoor :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

.oisyn schreef op 08 september 2004 @ 14:08:
strtol is gewoon ISO C hoor :)
Daar denken mijn manuals anders over, C89 is het iig niet :

CONFORMING TO
SVID 3, BSD 4.3, ISO 9899

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

strtol of strtod zijn de betere C functies hiervoor. Zitten in stdlib.h

Verder wat mietje en igmar al zeggen: optvar wordt niet geinitialiseerd voor -s, dus zal wel NULL zijn.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

igmar schreef op 08 september 2004 @ 14:12:
[...]


Daar denken mijn manuals anders over, C89 is het iig niet :

CONFORMING TO
SVID 3, BSD 4.3, ISO 9899
Euh ja, wat denk je dat ISO 9899 betekent? ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

.oisyn schreef op 08 september 2004 @ 20:19:
Euh ja, wat denk je dat ISO 9899 betekent? ;)
ISO C99 :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee dat is ISO 9899:1999. ISO 9899 is eigenlijk ISO 9899:1990 en derhalve C90, maar dat is gewoon bijna hetzelfde als ANSI C89
In 1983, the American National Standards Institute (ANSI) formed a committee, X3J11, to establish a standard specification of C. After a long and arduous process, the standard was completed in 1989 (one year after the first ANSI standard for C++!) and ratified as ANSI X3.159-1989 "Programming Language C". This version of the language is often referred to as ANSI C. In 1990, the ANSI C standard (with a few minor modifications) was adopted by the International Standards Organization (ISO) as ISO/IEC 9899:1990
Verder zeggen zo'n beetje alle online docs dat strtol gewoon ANSI is.

[ Voor 73% gewijzigd door .oisyn op 08-09-2004 20:46 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

.oisyn schreef op 08 september 2004 @ 20:44:
Nee dat is ISO 9899:1999. ISO 9899 is eigenlijk ISO 9899:1990 en derhalve C90, maar dat is gewoon bijna hetzelfde als ANSI C89
Inderdaad, de FreeBSD manual is d'r wat duidelijker in. Ik ga d'r iig zelf altijd vanuit dat ik de functie kan gebruiken :)
Pagina: 1