Szegmens hiba – de miért?

Kezdőlap Fórumok Programozás Szegmens hiba – de miért?

10 bejegyzés megtekintése - 1-10 / 77
  • Szerző
    Bejegyzés
  • #2164518
    lacix
    Felhasználó

      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 helyet

      #2164519
      lacix
      Felhasználó

        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 helyet

        #2164520
        uzsolt
        Felhasználó

          Egyré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.

          #2164521
          uzsolt
          Felhasználó

            Egyré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.

            #2164522
            zoltan22
            Felhasználó

              Az „nc_strcat” fuggvenyrol mit lehet tudni? Anelkul nem akar nalam fordulni.

              #2164523
              zoltan22
              Felhasználó

                Az „nc_strcat” fuggvenyrol mit lehet tudni? Anelkul nem akar nalam fordulni.

                #2164524
                zoltan22
                Felhasználó

                  Az 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.

                  #2164525
                  zoltan22
                  Felhasználó

                    Az 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.

                    #2164526
                    gabaman
                    Felhasználó
                      uzsolt 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;
                      }

                      #2164527
                      gabaman
                      Felhasználó
                        uzsolt 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;
                        }

                      10 bejegyzés megtekintése - 1-10 / 77
                      • Be kell jelentkezni a hozzászóláshoz.