Tämmöinen koodi:
#include <stdio.h> #include <stdlib.h> struct TUOTE { char nimi[20]; int tunnus, montako, hinta; }; int main() { TUOTE tuote; puts("Kirjoita jonkun tuotteen nimi viivalle (ei v\x84lily\x94ntej\x84!): "); gets(tuote.nimi); puts("\n\nSeuraavaksi ko. tuotteen hinta, kiiitos...: "); scanf("%d", tuote.hinta); puts("\n\nTuotteen tunnus (numeroita): "); scanf("%d", tuote.tunnus); puts("\n\nOkei.. Ja montakos niit\x84 on: "); scanf("%d", tuote.montako); return 0; }
aiheuttaa Dev-C++:lla debugattaessa virheen "An acces error (Segmentation fault) raised in your program". Mitäköhän tämä mahtaa tarkoittaa?
Itse en ainakaan tajua, mikä siinä olisi vikana...
Osaisiko joku auttaa?
Kentti kirjoitti:
"An acces error (Segmentation fault) raised in your program". Mitäköhän tämä mahtaa tarkoittaa?
Yrität kirjoittaa sellaiseen kohtaan muistia, johon ei saa.
Kentti kirjoitti:
scanf("%d", tuote.hinta);
scanf odottaa toiseksi parametrikseen muistiosoitetta, johon tuo luettava data laitetaan. tuote.hinta ei ole muistiosoite, vaan itse arvo. Muuttujan osoitteen saa laittamalla &-merkin sen nimen eteen.
Kannattaa muuten huomata, että koodisi ei oo turvallista. Mitä tapahtuu, jos käyttäjä nimeä kysyttäessä antaa enemmän kuin 20 merkkiä? Käytä getsin sijaan fgetsiä. Sillä voi rajoittaa, kuinka monta merkkiä maksimissaan luetaan.
Juu no nuo ovat vain harjoitustehtäviä C++ -kirjasta.
Mutta kiitos, nyt toimii.
PS. Ja eipä ainakaan minulla tapahtunut juuri mitään, vaikka syötin yli 19 merkkiä :)
Kentti kirjoitti:
PS. Ja eipä ainakaan minulla tapahtunut juuri mitään, vaikka syötin yli 19 merkkiä :)
Ja tuohonpa ei kannata luottaa. (Se kyllä kirjottaa jonnekkin jotain hassua.)
Saatat kirjottaa esimerkiksi muuttujan yli, ja sitten ihmetellään miksi muuttuja muuttuu ihmeellisesti.
Ja sitten voi tulla myös muita hassuja virheitä, esimerkiksi segmentation fault.
Kentti kirjoitti:
Juu no nuo ovat vain harjoitustehtäviä C++ -kirjasta.
Huono kirja, jos tollasia opettaa.
Kentti kirjoitti:
Ja eipä ainakaan minulla tapahtunut juuri mitään, vaikka syötin yli 19 merkkiä :)
Sattu hyvä tuuri. Tuossa on pinossa puskuriylivuoto. http://en.wikipedia.org/wiki/Buffer_overflow
Blaze kirjoitti:
Huono kirja, jos tollasia opettaa.
Enpä ole siinä vielä kovin pitkällä, ja kirja on C++ ja Olio-ohjelmointi (Päivi Hietanen).
Mutta en rupea väittelemään tuosta ylivuotoasiasta, kuten mainitsit, hyvää tuuria.
Kentti kirjoitti:
Juu no nuo ovat vain harjoitustehtäviä C++ -kirjasta.
Tuolla tarkoitin, että kirjassa on tehtävä: "Tee ohjelma joka ...", joten koodi on täysin omaa eikä kirjasta kopioitua.
Aihe on jo aika vanha, joten et voi enää vastata siihen.