Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Segmentation fault

Neukku [11.02.2010 12:01:08]

#

Hei, osaisiko joku kertoa tuosta mun valgrind logista että minkä takia se herjaa? Tarkoituksena on tehdä funktio, joka ottaa parametrina tuplapointterin, tässä tapauksessa kaksiulotteisen merkkijonotaulukon. Ja funktion pitäisi palauttaa yksiulotteinen taulukko tähän tyyliin:

Array containing following strings:
array[0]="Joo_"
array[1]="e_taegeat"
array[2]="ls"
array[3]="lhsr_r"
array[4]=NULL

results into a string: "Jello_shots_are_great"

Ja pitäisi toimia siis kaikilla annetuilla char **.

En valitetttavasti voi näyttää koodia, koska se on kurssin sääntöjen mukaan kielletty =(

Tein myös main ohjelman. Maini ja tuo kääntyy, mutta suorittaessa tulee virhesanoma: Segmentation fault.

Valgrind-loki näyttää tältä:

==17155== Memcheck, a memory error detector.
==17155== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al.
==17155== Using LibVEX rev 1884, a library for dynamic binary translation.
==17155== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP.
==17155== Using valgrind-3.4.1-Debian, a dynamic binary instrumentation framework.
==17155== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al.
==17155== For more details, rerun with: -v
==17155==
==17155== Invalid read of size 1
==17155==    at 0x4C28022: strlen (mc_replace_strmem.c:242)
==17155==    by 0x4006E5: strMix (strmix.c:28)
==17155==    by 0x40066C: main (strmixMain.c:14)
==17155==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==17155==
==17155== Process terminating with default action of signal 11 (SIGSEGV)
==17155==  Access not within mapped region at address 0x0
==17155==    at 0x4C28022: strlen (mc_replace_strmem.c:242)
==17155==    by 0x4006E5: strMix (strmix.c:28)
==17155==    by 0x40066C: main (strmixMain.c:14)
==17155==  If you believe this happened as a result of a stack overflow in your
==17155==  program's main thread (unlikely but possible), you can try to increase
==17155==  the size of the main thread stack using the --main-stacksize= flag.
==17155==  The main thread stack size used in this run was 8388608.
==17155==
==17155== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 8 from 1)
==17155== malloc/free: in use at exit: 0 bytes in 0 blocks.
==17155== malloc/free: 0 allocs, 0 frees, 0 bytes allocated.
==17155== For counts of detected errors, rerun with: -v
==17155== All heap blocks were freed -- no leaks are possible.
Segmentation fault

Jos joku osaisi auttaa, niin suurkiitokset!

os [11.02.2010 14:52:52]

#

Valgrind-lokista päätellen yrität kutsua strlen(NULL), mikä ei ole sallittua. Jos et tiedä, miksi ei, käy selvittämässä tämä jonkin C-oppaan kohdasta "merkkijonot" (NULL on eri asia kuin tyhjä merkkijono "").

Oikea tapa tunnistaa kuvaamasi taulukon viimeinen alkio on verrata pointteria arvoon NULL:

if (array[i]==NULL) ...

siis ei näin:

if (strlen(array[i])==0) ...

P.S.: tällaisten ongelmien ratkaiseminen onnistuu kätevämmin GDB:llä (joka on myös asennettu valmiiksi TKK:n koneille), joten kannattaa opetella käyttämään myös sitä.

Neukku [12.02.2010 18:49:02]

#

Joo kiitoksia, sain ohjelmani toimimaan =).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta