Kezdőlap › Fórumok › Programozás › Szegmens hiba – de miért?
- This topic has 76 hozzászólás, 6 résztvevő, and was last updated 17 years, 1 months telt el by
pointux.
-
SzerzőBejegyzés
-
2008-06-17-11:39 #2164518
leírhatnád, hogy mit akar csinálni ez a függvény, ne kelljen már azon is gondolkozni
az strdup saját magának foglal helyet2008-06-17-11:39 #2164519leírhatnád, hogy mit akar csinálni ez a függvény, ne kelljen már azon is gondolkozni
az strdup saját magának foglal helyet2008-06-17-12:20 #2164520Egyrészt nem az strdup függvénnyel van gond, tudom, hogyan kell használni.
Közben, mintha nem foglalna magának elég memóriát, vagy rossz helyre foglalata, a fene tudja.
Szerintem a függvény nevéből (nc_readdir) kitalálható, hogy mit csinál: beolvassa a könyvtár tartalmát, és a fájlok listáját és tulajdonságait visszaadja a **files-ba.
Vagy soronként magyarázzam?Próbáld ki a következő main-függvénnyel:
Code:int main (int argc , char **argv) {
nc_file *files;
int mennyi,i;mennyi = nc_readdir(argv[1],&files);
for (i=0; i<mennyi; i++) {
printf("%sn",files[i].name);
}return 0;
}Persze paramétert adj neki 🙂 Próbáld ki egy-két könyvtárra, és meglátod.
2008-06-17-12:20 #2164521Egyrészt nem az strdup függvénnyel van gond, tudom, hogyan kell használni.
Közben, mintha nem foglalna magának elég memóriát, vagy rossz helyre foglalata, a fene tudja.
Szerintem a függvény nevéből (nc_readdir) kitalálható, hogy mit csinál: beolvassa a könyvtár tartalmát, és a fájlok listáját és tulajdonságait visszaadja a **files-ba.
Vagy soronként magyarázzam?Próbáld ki a következő main-függvénnyel:
Code:int main (int argc , char **argv) {
nc_file *files;
int mennyi,i;mennyi = nc_readdir(argv[1],&files);
for (i=0; i<mennyi; i++) {
printf("%sn",files[i].name);
}return 0;
}Persze paramétert adj neki 🙂 Próbáld ki egy-két könyvtárra, és meglátod.
2008-06-17-13:41 #2164522Az „nc_strcat” fuggvenyrol mit lehet tudni? Anelkul nem akar nalam fordulni.
2008-06-17-13:41 #2164523Az „nc_strcat” fuggvenyrol mit lehet tudni? Anelkul nem akar nalam fordulni.
2008-06-17-13:50 #2164524Az nc_strcat-ot megoldottam egy
Code:#define nc_strcat strcat-al.
Futtattasi eredmenyek nalam:Code:$ gcc -g -Wall nc.c nc-test.c -DDEBUG -o nc
nc.c: In function ‘nc_readdir’:
nc.c:14: warning: unused variable ‘prop’
$ valgrind ./nc /tmp/
==5018== Memcheck, a memory error detector.
==5018== Copyright (C) 2002-2007, and GNU GPL’d, by Julian Seward et al.
==5018== Using LibVEX rev 1804, a library for dynamic binary translation.
==5018== Copyright (C) 2004-2007, and GNU GPL’d, by OpenWorks LLP.
==5018== Using valgrind-3.3.0, a dynamic binary instrumentation framework.
==5018== Copyright (C) 2000-2007, and GNU GPL’d, by Julian Seward et al.
==5018== For more details, rerun with: -v
==5018==
DEBUG: nc.c 28. malloc files
DEBUG: nc.c 33. mallocing ok
DEBUG: nc.c 56. strdup
0. gedit.zolee.3245775330
DEBUG: nc.c 61. strdup ok
DEBUG: nc.c 64. stat
==5018== Invalid write of size 4
==5018== at 0x40CB750: __xstat32_conv (in /lib/libc-2.6.1.so)
==5018== by 0x40C6410: _xstat (in /lib/libc-2.6.1.so)
==5018== by 0x80488FB: stat (in /mnt/Data-ext3/c/nc)
==5018== by 0x80487BD: nc_readdir (nc.c:67)
==5018== by 0x804883F: main (nc-test.c:8)
==5018== Address 0x41362a8 is 0 bytes inside a block of size 1 alloc’d
==5018== at 0x401D5AD: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5018== by 0x8048781: nc_readdir (nc.c:66)
==5018== by 0x804883F: main (nc-test.c:8)
==5018==
==5018== Invalid write of size 4
==5018== at 0x40CB752: __xstat32_conv (in /lib/libc-2.6.1.so)
==5018== by 0x40C6410: _xstat (in /lib/libc-2.6.1.so)
==5018== by 0x80488FB: stat (in /mnt/Data-ext3/c/nc)
==5018== by 0x80487BD: nc_readdir (nc.c:67)
==5018== by 0x804883F: main (nc-test.c:8)
==5018== Address 0x41362ac is 3 bytes after a block of size 1 alloc’d
==5018== at 0x401D5AD: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5018== by 0x8048781: nc_readdir (nc.c:66)
==5018== by 0x804883F: main (nc-test.c:8)
==5018==
==5018== Invalid write of size 2
==5018== at 0x40CB755: __xstat32_conv (in /lib/libc-2.6.1.so)
==5018== by 0x40C6410: _xstat (in /lib/libc-2.6.1.so)
==5018== by 0x80488FB: stat (in /mnt/Data-ext3/c/nc)
==5018== by 0x80487BD: nc_readdir (nc.c:67)
==5018== by 0x804883F: main (nc-test.c:8)
==5018== Address 0x41362b0 is 7 bytes after a block of size 1 alloc’d
==5018== at 0x401D5AD: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5018== by 0x8048781: nc_readdir (nc.c:66)
==5018== by 0x804883F: main (nc-test.c:8)
==5018==
==5018== Invalid write of size 4
==5018== at 0x40CB76F: __xstat32_conv (in /lib/libc-2.6.1.so)
==5018== by 0x40C6410: _xstat (in /lib/libc-2.6.1.so)
==5018== by 0x80488FB: stat (in /mnt/Data-ext3/c/nc)
==5018== by 0x80487BD: nc_readdir (nc.c:67)
==5018== by 0x804883F: main (nc-test.c:8)
==5018== Address 0x41362b4 is 11 bytes after a block of size 1 alloc’d
==5018== at 0x401D5AD: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5018== by 0x8048781: nc_readdir (nc.c:66)
==5018== by 0x804883F: main (nc-test.c:8)Ez a hiba igy meg sokszor ismetlodik.
2008-06-17-13:50 #2164525Az nc_strcat-ot megoldottam egy
Code:#define nc_strcat strcat-al.
Futtattasi eredmenyek nalam:Code:$ gcc -g -Wall nc.c nc-test.c -DDEBUG -o nc
nc.c: In function ‘nc_readdir’:
nc.c:14: warning: unused variable ‘prop’
$ valgrind ./nc /tmp/
==5018== Memcheck, a memory error detector.
==5018== Copyright (C) 2002-2007, and GNU GPL’d, by Julian Seward et al.
==5018== Using LibVEX rev 1804, a library for dynamic binary translation.
==5018== Copyright (C) 2004-2007, and GNU GPL’d, by OpenWorks LLP.
==5018== Using valgrind-3.3.0, a dynamic binary instrumentation framework.
==5018== Copyright (C) 2000-2007, and GNU GPL’d, by Julian Seward et al.
==5018== For more details, rerun with: -v
==5018==
DEBUG: nc.c 28. malloc files
DEBUG: nc.c 33. mallocing ok
DEBUG: nc.c 56. strdup
0. gedit.zolee.3245775330
DEBUG: nc.c 61. strdup ok
DEBUG: nc.c 64. stat
==5018== Invalid write of size 4
==5018== at 0x40CB750: __xstat32_conv (in /lib/libc-2.6.1.so)
==5018== by 0x40C6410: _xstat (in /lib/libc-2.6.1.so)
==5018== by 0x80488FB: stat (in /mnt/Data-ext3/c/nc)
==5018== by 0x80487BD: nc_readdir (nc.c:67)
==5018== by 0x804883F: main (nc-test.c:8)
==5018== Address 0x41362a8 is 0 bytes inside a block of size 1 alloc’d
==5018== at 0x401D5AD: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5018== by 0x8048781: nc_readdir (nc.c:66)
==5018== by 0x804883F: main (nc-test.c:8)
==5018==
==5018== Invalid write of size 4
==5018== at 0x40CB752: __xstat32_conv (in /lib/libc-2.6.1.so)
==5018== by 0x40C6410: _xstat (in /lib/libc-2.6.1.so)
==5018== by 0x80488FB: stat (in /mnt/Data-ext3/c/nc)
==5018== by 0x80487BD: nc_readdir (nc.c:67)
==5018== by 0x804883F: main (nc-test.c:8)
==5018== Address 0x41362ac is 3 bytes after a block of size 1 alloc’d
==5018== at 0x401D5AD: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5018== by 0x8048781: nc_readdir (nc.c:66)
==5018== by 0x804883F: main (nc-test.c:8)
==5018==
==5018== Invalid write of size 2
==5018== at 0x40CB755: __xstat32_conv (in /lib/libc-2.6.1.so)
==5018== by 0x40C6410: _xstat (in /lib/libc-2.6.1.so)
==5018== by 0x80488FB: stat (in /mnt/Data-ext3/c/nc)
==5018== by 0x80487BD: nc_readdir (nc.c:67)
==5018== by 0x804883F: main (nc-test.c:8)
==5018== Address 0x41362b0 is 7 bytes after a block of size 1 alloc’d
==5018== at 0x401D5AD: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5018== by 0x8048781: nc_readdir (nc.c:66)
==5018== by 0x804883F: main (nc-test.c:8)
==5018==
==5018== Invalid write of size 4
==5018== at 0x40CB76F: __xstat32_conv (in /lib/libc-2.6.1.so)
==5018== by 0x40C6410: _xstat (in /lib/libc-2.6.1.so)
==5018== by 0x80488FB: stat (in /mnt/Data-ext3/c/nc)
==5018== by 0x80487BD: nc_readdir (nc.c:67)
==5018== by 0x804883F: main (nc-test.c:8)
==5018== Address 0x41362b4 is 11 bytes after a block of size 1 alloc’d
==5018== at 0x401D5AD: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5018== by 0x8048781: nc_readdir (nc.c:66)
==5018== by 0x804883F: main (nc-test.c:8)Ez a hiba igy meg sokszor ismetlodik.
2008-06-17-14:01 #2164526uzsolt wrote:Valamint ha /home/zsolt/data paraméterrel hívom az nc_readdir-t, akkor jó. Ha /home/zsolt/data/-val, akkor szegmens hiba.Talán jobban megérted mi a különbség a két név, ha utánanézel mi mivel kompatibilis. A /home/zsolt/data ugynaz mint a /home/zsolt/data/. (per pont), és a /home/zsolt/data/ ugynaz mint a /home/zsolt/data/* (per csillag). Nézd meg a path paraméter utolsó karakterét, ha ‘/’ akkor tegyél oda egy sor végét (0).
uzsolt wrote:Code:int nof = -1;(…)
while ( (d_file=readdir(d_dir)) != NULL ) {
nof++;(…)
} // end of ‘while’
(…)
(*files)[nof].name = strdup(d_file->d_name);return nof;
}Ez a gond. Ha nincs elem, akkor a nof értéke -1, a (*files)[nof].name miatt lesz szegmens hiba, mert a nulladik elem előtti helyre ír. A nof értékét növeld a ciklus végén:
Code:int nof = 0;(…)
while ( (d_file=readdir(d_dir)) != NULL ) {
(…)
nof++;
} // end of ‘while’
(…)
(*files)[nof].name = strdup(d_file->d_name);return nof;
}2008-06-17-14:01 #2164527uzsolt wrote:Valamint ha /home/zsolt/data paraméterrel hívom az nc_readdir-t, akkor jó. Ha /home/zsolt/data/-val, akkor szegmens hiba.Talán jobban megérted mi a különbség a két név, ha utánanézel mi mivel kompatibilis. A /home/zsolt/data ugynaz mint a /home/zsolt/data/. (per pont), és a /home/zsolt/data/ ugynaz mint a /home/zsolt/data/* (per csillag). Nézd meg a path paraméter utolsó karakterét, ha ‘/’ akkor tegyél oda egy sor végét (0).
uzsolt wrote:Code:int nof = -1;(…)
while ( (d_file=readdir(d_dir)) != NULL ) {
nof++;(…)
} // end of ‘while’
(…)
(*files)[nof].name = strdup(d_file->d_name);return nof;
}Ez a gond. Ha nincs elem, akkor a nof értéke -1, a (*files)[nof].name miatt lesz szegmens hiba, mert a nulladik elem előtti helyre ír. A nof értékét növeld a ciklus végén:
Code:int nof = 0;(…)
while ( (d_file=readdir(d_dir)) != NULL ) {
(…)
nof++;
} // end of ‘while’
(…)
(*files)[nof].name = strdup(d_file->d_name);return nof;
} -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz