Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Segmenatation fault?!!

[es] :: C/C++ programiranje :: C/C++ za početnike :: Segmenatation fault?!!

[ Pregleda: 3055 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

raven87
ar

Član broj: 110102
Poruke: 11
194.106.174.*



Profil

icon Segmenatation fault?!!20.09.2006. u 19:25 - pre 214 meseci
Pokušavam sebi da raščistim neke stvari oko stringova i pokazivača itd, pa mi nije jasna jedna poruka. Uspešno sam kompajlrao sledeći kod:
Code:

#include<iostream.h>

int main (int argc, char *argv[])
{
        char ime[]="";
        cout<<endl<<"Unesite vaše ime: "<< endl;
        cin>>ime;
        return 0;
}


I pri izlazku iz programa prijavi mi Segmentation fault gresku :
Citat:

root@lifeartist-desktop:/home/lifeartist/Projects/mysqlpp# ./a.out

Unesite vaše ime:
Nikola
Segmentation fault
root@lifeartist-desktop:/home/lifeartist/Projects/mysqlpp#


A kada
Citat:
char ime[]="";
zamenim sa
Citat:
char ime[50];
, tog Segmentation fault-a nema. Da li to ima veze do OSa[pošto nisam probao da kompajliram pod windžom], ili vec... ja nemam pojma pa sam rad da mi neko objasni :)
 
Odgovor na temu

k4rl0
Localhost

Član broj: 87683
Poruke: 142
*.adsl.net.t-com.hr.



Profil

icon Re: Segmenatation fault?!!20.09.2006. u 19:31 - pre 214 meseci
Probaj:
char ime[]=" ";
Znaci razdvoji navodnike.
BTW bolje i je koristit stringove iz string.h librarya,a ne
ove C-based stringove.
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
*.3dnet.co.yu.



+2 Profil

icon Re: Segmenatation fault?!!20.09.2006. u 20:52 - pre 214 meseci
@k4rl0
Ako ne znaš nemoj lupati.

@raven87
Znači ne koristi stringove dok ne shvatiš kako ovo radi. Ne koristi vektore dok ne shvatiš kako rade povezane liste i sl...
Code:

char ime[];

Označava statički niz karaktera nedefinisane dužine.
Code:

char ime[]="";

Ovo ti je statički niz karaktera čija je dužina jednaka onome stringu posle znakova jednakosti, a to je samo karakter '\0' koji ti ne vidiš, a on označava kraj stringa.
Nadam se da praviš razliku između '' i "". Ako ne znaš, objasniću ti i to.
Šta ne valja u tvom kodu?
Recimo da za ime uneseš "PERA";
PERA ti je sledeći niz karaktera
Code:

{ 'P', 'E', 'R', 'A', '\0' }


Tvoje ime je sledeći niz karaktera
Code:

{  '\0' }


Znači ti pokušavaš da u niz čiji je kapacitet 1 element, smestiš niz koji ima 5 elemenata.
I tu se javila greška.

Ako pretpostaviš da korisnik neće uneti više od 30 karaktera za ime, tvoj kod bi glasio ovako
Code:

#include <iostream>
using namespace std;

int main (int argc, char *argv[])
{
        char ime[50];
        cout << endl<< "Unesite vaše ime: " << endl;
        cin >> ime;
    cout << ime << endl;
    system("PAUSE");
        return 0;
}


Sad ti pokušaj da to isto odradiš ali preko dinamičkih nizova.
Znači da ne koristiš char ime[50], već char* ime ...
I sad ti je valjda jasno zašto rešenje koje je dao k4rl0 neće raditi.
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

k4rl0
Localhost

Član broj: 87683
Poruke: 142
*.adsl.net.t-com.hr.



Profil

icon Re: Segmenatation fault?!!20.09.2006. u 21:18 - pre 214 meseci
Gledaj,onaj moj primjer radi,to sto si ti sad na mene ljut i
pokusavas me omalovazavat,jer sam u onom postu koristio
rijec "seljaci"(znam da nisam trebo,ispricavam se).
Upisi moj kod u Dev C++,kompajliraj,sve radi kako spada.
BTW kad koristis system() moras includat stdlib library..
Amen
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: Segmenatation fault?!!20.09.2006. u 21:42 - pre 214 meseci
Pharos je u pravu.

Sa Dev-cpp-om radi i njegov primjer.
Jedno objesnjene je da se nakon 'ime' nalazi memorijski prostor koji je u vlasnistvu iste aplikacije, pa overflov u to podrucje windows tolerira.

Ovakva stvar me zeznula na drzavnome, windows ne primjecuje, ali linux da.
 
Odgovor na temu

k4rl0
Localhost

Član broj: 87683
Poruke: 142
*.adsl.net.t-com.hr.



Profil

icon Re: Segmenatation fault?!!20.09.2006. u 22:04 - pre 214 meseci
Onda smo oboje u pravu..
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
*.3dnet.co.yu.



+2 Profil

icon Re: Segmenatation fault?!!20.09.2006. u 22:24 - pre 214 meseci
Citat:
k4rl0: Gledaj,onaj moj primjer radi,to sto si ti sad na mene ljut i
pokusavas me omalovazavat,jer sam u onom postu koristio
rijec "seljaci"(znam da nisam trebo,ispricavam se).
Upisi moj kod u Dev C++,kompajliraj,sve radi kako spada.
Amen

Čoveče ne budi smešan. Što bih ja bio ljut na tebe :))
Kod nije dobar i objasnio sam gore zašto.
Prevodilac ne prijavljuje grešku ako za ime uneseš 1 karakter, ali ako za ime uneseš reč dužine > 1, pri izlazu iz programa prijaviće se neka greška.
E sad da ti objasnim neke stvari.
Svaka promenljiva tipa string je ništa drugo do niz karaktera + 1 karakter '\0' koji označava kraj stringa.
Pa sam ti tamo gore napisao kako izgleda taj niz kad se unese reč pera.
Kad si neku promenljivu tipa string sačuvao u memoriji računara i napisao:

Code:

cout << ime;


Na glavnom izlazu će se ispisati prvi karakter(element) iz tog niza(stringa) karaktera. Zatim se piše sledeći element, pa sledeći, pa sledeći... i sve tako dok se ne dođe do karaktera '\0' koji označava kraj stringa.

Kada napišeš
Code:

char ime[10];

Ti deklarišeš jednu promenljivu ime, koja je statički niz elemenata tipa char. Prvi element pokazuje na naredni element i tako redom.
Pogledaj sad sledeći kod
Code:

#include <iostream>
using namespace std;

int main ()
{
        char ime[10];
        for(int i=0; i<10;)
            cout << ime[i++];
        system("PAUSE");
        return 0;
}

Odvojio sam memorisjki prostor za niz ime i sada na glavnom izlazu hoću da ispišem svih 10 karaktera iz tog niza.
Očekuješ da na ekranu neće pisati ništa. A što ne bi pisalo?
Ti si samo dodelio memoriju tom nizu, ali nisi izbrisao sadržaj tih memorijskih lokacija. Tu se nalaze neki podaci, a ne znamo koji i na ekranu će pisati hijeroglifi.
Probaj sad samo
Code:

#include <iostream>
using namespace std;

int main ()
{
        char ime[10];
        cout << ime;
        system("PAUSE");
        return 0;
}

Situacija je malo izmenjena. Prikazano je isto što i gore i još nešto viška. Naime, poslednji član u nizu pokazuje na sledeću mem. lokaciju očekujući karakter koji signalizira kraj stringa i ispisuje ga. Pošto to nije '\0' karakter ispisuje se sadržaj te mom lokacije, a kako se odatle ne pokazuje na sledeću mem. lokaciju, tu se tvoj ispis završava.
Kada radiš
Code:

cin >> ime;

Ti kopiraš niz karaktera sa glavnog ulaza u niz ime.
Svaki element niza je zasebna mem. lokacija
Ako si za ime odvojio 10 elemenata, i uneo reč PERA, prvih 5 elemanata će biti prebrisano novim podacima, a ostali će ostati neizmenjeni.
Znači imao si
Code:

{ x, x, x, x, x, x, x, x, x, x }

sada imaš
Code:

{ 'P', 'E', 'R', 'A', '\0', x, x, x, x, x }

Sa x je označen neki slučajni sadržaj, ne znamo koji.
Kada sad odradiš
cout << ime;
Na izlazu se prvo ispiše P, taj element pokazuje na sledeću mem. lokaciju gde se nalazi 'E' i sve tako dok ne dođeš do '\0' gde se signalizira kraj i ispis završava.
Ono što si ti radio je sledeće.
Imao si niz ime
Code:

{ ' ', '\0' }

Zatim si u njega pokušao da kopiraš recimo niz
Code:

{ 'P', 'E', 'R', 'A', '\0' }

Na mesto prvog člana u nizu se kopira P, na mesto drugog E, ali tu nije kraj jer E više ne bi trebalo nigde da pokazuje, ali ono pokazuje na mem lokaciju gde se nalazi 'R', pa onda se pokazuje na 'A' i na kraju na '\0' koje ne pokazuje na ništa.
Za rezultat si stvarno imao napisano ime PERA iako je moglo da stane samo P i sad si nadam se video gde je greška.

Izvinjavam se svima ako samo malo lošije objasnio. Za ovo se treba crtati heap i steak i izuskuje više vremena, a to mi se nije dalo :D
Ko hoće detaljno i stručnije da objašnjava, slobodno. Ovo je bio samo mali hint :)
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

pcaca
Aleksandar
Makedonija

Član broj: 5333
Poruke: 92
62.162.198.*



Profil

icon Re: Segmenatation fault?!!20.09.2006. u 23:12 - pre 214 meseci
Citat:
k4rl0: Gledaj,onaj moj primjer radi,to sto si ti sad na mene ljut i
pokusavas me omalovazavat,jer sam u onom postu koristio
rijec "seljaci"(znam da nisam trebo,ispricavam se).
Upisi moj kod u Dev C++,kompajliraj,sve radi kako spada.
BTW kad koristis system() moras includat stdlib library..
Amen

Citat:
k4rl0: Onda smo oboje u pravu..

Niste obojca u pravu. Tvoj kod je pogresan i je sigurnosni propust u programu, klasican buffer overflow. To sto pojedini kompajler ne prijavljuje nista neznaci da je kod ispravan, nego da Dev C++ (GCC) ne proverava takve greske pri runtime. VS2005 sve lepo prijavi:
Run-Time Check Failure #2 - Stack around the variable 'ime' was corrupted.

To ti je greska posle izvrsavanja tvog koda.

Evo ti pogledaj malo i ovu temu:
http://www.elitesecurity.org/t194893-Sram-ih-sve-moze-biti
 
Odgovor na temu

raven87
ar

Član broj: 110102
Poruke: 11
194.106.174.*



Profil

icon Re: Segmenatation fault?!!20.09.2006. u 23:44 - pre 214 meseci
Kao prvo, kada zamenim niz sa duzinom jedan [ \O], sa nizom duzine dva pri inicijalizaciji ( =" ") ne dobijam nikakvu promenu, odnosnoopet mi nakon izvrsenog programa prijavljuje "segmentation fault". Dalje, kad koristim char* ime, umesto char ime[] dobijam malo poduzu gresku...
Citat:

Unesite vaše ime:
Nikola
14388: symbol=_ZNSt8ios_base4InitD1Ev; lookup in file=./a.out
14388: symbol=_ZNSt8ios_base4InitD1Ev; lookup in file=/usr/lib/libstdc++.so.6
14388: binding file ./a.out to /usr/lib/libstdc++.so.6: normal symbol `_ZNSt8ios_base4InitD1Ev' [GLIBCXX_3.4]
14388: symbol=_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv; lookup in file=./a.out
14388: symbol=_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv; lookup in file=/usr/lib/libstdc++.so.6
14388: binding file /usr/lib/libstdc++.so.6 to /usr/lib/libstdc++.so.6: normal symbol `_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv' [GLIBCXX_3.4]
14388:
14388: calling fini: /usr/lib/libstdc++.so.6 [0]
14388:
14388: symbol=__cxa_finalize; lookup in file=./a.out
14388: symbol=__cxa_finalize; lookup in file=/usr/lib/libstdc++.so.6
14388: symbol=__cxa_finalize; lookup in file=/lib/tls/i686/cmov/libm.so.6
14388: symbol=__cxa_finalize; lookup in file=/lib/libgcc_s.so.1
14388: symbol=__cxa_finalize; lookup in file=/lib/tls/i686/cmov/libc.so.6
14388: binding file /usr/lib/libstdc++.so.6 to /lib/tls/i686/cmov/libc.so.6: normal symbol `__cxa_finalize' [GLIBC_2.1.3]
14388:
14388: calling fini: /lib/tls/i686/cmov/libm.so.6 [0]
14388:
14388: symbol=__cxa_finalize; lookup in file=./a.out
14388: symbol=__cxa_finalize; lookup in file=/usr/lib/libstdc++.so.6
14388: symbol=__cxa_finalize; lookup in file=/lib/tls/i686/cmov/libm.so.6
14388: symbol=__cxa_finalize; lookup in file=/lib/libgcc_s.so.1
14388: symbol=__cxa_finalize; lookup in file=/lib/tls/i686/cmov/libc.so.6
14388: binding file /lib/tls/i686/cmov/libm.so.6 to /lib/tls/i686/cmov/libc.so.6: normal symbol `__cxa_finalize' [GLIBC_2.1.3]
14388:
14388: calling fini: /lib/libgcc_s.so.1 [0]
14388:
14388: symbol=__cxa_finalize; lookup in file=./a.out
14388: symbol=__cxa_finalize; lookup in file=/usr/lib/libstdc++.so.6
14388: symbol=__cxa_finalize; lookup in file=/lib/tls/i686/cmov/libm.so.6
14388: symbol=__cxa_finalize; lookup in file=/lib/libgcc_s.so.1
14388: symbol=__cxa_finalize; lookup in file=/lib/tls/i686/cmov/libc.so.6
14388: binding file /lib/libgcc_s.so.1 to /lib/tls/i686/cmov/libc.so.6: normal symbol `__cxa_finalize' [GLIBC_2.1.3]
14388:
14388: calling fini: /lib/tls/i686/cmov/libc.so.6 [0]
14388:


Sto je malo duze... Znam ja kako da koristim <string.h> biblioteku, imam cak i neku biblioteku, koja definise objekat tipa string, ali mene je samo interesovao taj segmentation fault....

Kako da mi taj niz dinamicki menja duzinu, odnosno da mu ne definisem maximalnu duzinu kao char[50], vec da ga definisem kao prazan niz u koji tek treba da se unesu elementi? Mislio sam da ce char* resiti prob, ali jbg... opet ne kapiram.
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
*.3dnet.co.yu.



+2 Profil

icon Re: Segmenatation fault?!!21.09.2006. u 00:06 - pre 214 meseci
Ja se ubih pišući i ništa :(
Segmentation fault ili segfault je greška koja se javlja kada program pokuša da pristupi memorijskoj lokaciji kojoj ne sme da ima pristup ili kada pristupa memorijskoj lokaciji na neki nedozvoljen način (kada piše po read-only lokaciji ili kada pokuša da overwrite-uje deo OS-a).
Klasičan primera jednog segfaulta je onaj prvi primer koji si dao i ovaj drugi koji pokušavaš.
Code:

int main(void)
{
    char *s = "string"; /* s is a pointer to a string in the read-only data segment of the executable. when the program
                           is loaded, this segment is normally mapped by the operating system into read-only memory */

    *s = 'a';           /* this attempts to write into the string in read-only memory, causing a segmentation fault */
}

Znači to ne može tako.
Ne postoje džabe f-je strcpy i slične, a možeš i ti da napišeš svoje.
Prvo moraš da skontaš kako radi memorija, pa tek onda da kreneš u rešavanje problema.
Zašto ne radi to sa char* ime?
Da li si odvojio potrebnu memoriju?

Na pitanje da li se može smestiti neki string u tačno rezervisan mem. prostor tako da nema tih viškova - odgovor je može.
Možeš sam napisati f-ju koja će to da odradi, a znaćeš kako da je napišeš kad budeš naučio organizaciju memorije i te pointere.
Šta je pointer, kako radi, kad se nešto smešta na heap, a kada na stek.

Da se odmah razumemo, pointeri su nešto najteže u C-u. Kad njih savladaš, možeš smatrati da si naučio C.
U cpp-u, pod uslovom da znaš pointere, klase su nešto najteže. Kad naučiš i klase, možeš se smatrati da znaš da programiraš.
Nemoj se odmah demoralisati. To što hoćeš da naučiš jeste jedna od najtežih stvari u programiranju i teško da možeš naučiti preko foruma.

77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

raven87
ar

Član broj: 110102
Poruke: 11
194.106.174.*



Profil

icon Re: Segmenatation fault?!!21.09.2006. u 00:12 - pre 214 meseci
Citat:
Zašto ne radi to sa char* ime?
Da li si odvojio potrebnu memoriju?


1. Mozes li mi objasniti kako da odvojim potrebnu memoriju[kratki pirmercic]
2. Koja je razlika izmedju char *promenljiva, i char* promenljiva
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
*.3dnet.co.yu.



+2 Profil

icon Re: Segmenatation fault?!!21.09.2006. u 00:17 - pre 214 meseci
Sad ga već preteruješ.
To su baš osnovne, osnovne stvari.
Ali ajde.

1.
Code:

char* ime = new char [30];


ili

Code:

char* ime;
ime = new char [30];


Potpuno je svejedno.

2.
Nema razlike :)
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

raven87
ar

Član broj: 110102
Poruke: 11
194.106.174.*



Profil

icon Re: Segmenatation fault?!!21.09.2006. u 10:56 - pre 214 meseci
fuck, ja sam totalno zaboravio na operator new... Bilo je to odavno kada sam citao u c i cpp-u. Hvala u svakom slucaju na pomoci...
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Segmenatation fault?!!

[ Pregleda: 3055 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.