![]() |
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Regler | Links | Albums | FAQ | Members List | Kalender | Søgning | Dagens Stillinger | Mark Forums Read |
| Højtstående Programmering Post spørgsmål om C, C + +, Java, SQL, og andre programmerings sprog her. |
Mere UNIX og Linux Forum Emner du måske kan finde Helpful
|
||||
| Tråd | Thread Starter | Forum | Svar | Last Post |
| Som Base Level Filesets nødvendigt med et specifikt program? | cypher82 | UNIX for Advanced & Ekspertsøgning Brugere | 4 | 05-29-2008 09:07 AM |
| Hjælp behov for C-program | dwgi32 | Højtstående Programmering | 2 | 11-19-2007 10:44 AM |
| Mærkelige ting ved FSS og VGs | mhenryj | AIX | 4 | 11-13-2007 04:42 PM |
| Mærkelige resultater med awk | amatheny | Shell Programmering og Scripting | 2 | 11-01-2007 06:12 PM |
| Weird Message???? | lesstjm | UNIX for dummyer Spørgsmål & svar | 6 | 01-04-2002 10:01 AM |
![]() |
|
|
LinkBack | Thread Tools | Søg denne tråd | Rate Thread | Display Modes |
|
|
|
||||
|
Weird C program. Help Needed
Hej,
Se venligst dette: Når jeg fremsætter en erklæring: char * i, j [15], * k; og gør derefter sprintf (k, "print.sh% s", i); programmet fungerer fint. Men når jeg ændre erklæring: char * I * k; og gør derefter sprintf (k, "print.sh% s", i); Jeg får en segmentering fejl på 'sprintf' erklæring. Programmet fungerer kun, når j er en vifte af 15. Intet mindre / mere ![]() Bemærk venligst: variabel j er blot en dummy. Jeg har absolut intet med det. Også, jeg ved at bruge sprintf den måde jeg har gjort, er ulovligt. Viseren er ikke henføres til noget, før en sådan erklæring. Det kan være dumt men kan nogen venligst forklare, hvorfor dette sker? Gæt noget at gøre med den måde, hukommelsen er tildelt.Thanks in advance! |
|
||||
|
Du forsøger at skrive til tilfældige hukommelse som "k" ikke har været opmærksom på noget. Kernen kan give dig tre svar ...
(a) lade dig gøre det (b) fælde, fordi du er ved at skrive til read only memory, f.eks programmet image (c) fælde, fordi du er ved at skrive til hukommelse, der ikke har været afsat til dig |
|
||||
|
Tja, på ovenstående linjer, jeg kan yderligere udlede:
1. i ét tilfælde, k blev der peger på Stdout (dont vide hvordan!), coz dens hukommelse indholdet var, at i min printf erklæring forud for sprintf. (Overraskende!) 2. I et tilfælde, k blev peger på strengen del af mit sprintf erklæring. Derfor igen, det ikke er ulovligt, og programmet vil arbejde. (Synes muligt). Men denne form for gyldig, men affaldsjournal initializations synes at ske, når variabel j er erklæret. Else, programmet stop ved SEGV. Men jeg mener stadig, at dette er en særlig og engangsforanstaltninger sag. Gæt den samme kode ville ikke arbejde på en anden maskine. (Min er Solaris). Eventuelle kommentarer / input / yderligere indblik nogen? |
|
||||
|
Stakken, at vigtigste bruger vil ikke være uberørt jomfru hukommelse, vil det have været anvendt til delrutinen forvandleTil opkald ved programmets Prolog, dvs crt0.o (eller hvad), før vigtigste () blive kaldt.
Hukommelsen er virkelig i en ukendt stat, men jeg tager Deres bemærkning om indholdet er gentagelig, under visse betingelser. Jeg vil kalde det et tilfælde af deja-vu. ![]() |
|
||||
|
enig
. Men i gentagne kørsler, programmet variabler tildeles samme hukommelsesplacering.Selv om behandling i et meget stort string (20 tegn) og sende det til sprintf er det overraskende, hvor der ikke er nogen segmentering skyld. På et eller andet tidspunkt, medmindre 'k' peger på Stdout, længden af hukommelse bør medføre krænkelse, og programmet bør få SEGV right? Også, hvis det overhovedet er "k" påpeger Stdout, ved udførelse af en flush straks, jeg vil se indholdet af "k" right? coz det kunne overskrive tidligere indhold af Stdout. |
|
||||
|
Citat:
Er du kører det under gdb og se, hvor tingene er egentlig hen? |
|
||||
|
Du har et problem i begge tilfælde. Den ene er at blive fanget, de andre er ikke.
"char * I, J [15], * k" siger følgende: Point til hukommelse og kalde det pointer i; Skabe mere plads i hukommelsen til at holde 15 tegn og kalder rummet j; og peg på hukommelsen og kalde at pointeren k; Når du forsøger at gøre "sprintf (k," print.sh% s ", i);" De beder computeren til at holde strengen "print.sh?" i hukommelsesplacering du påpeget med pointer variable k. Dit problem er, at du ikke har tildelt et rum til at holde snor i pointer placeringen af k, k er i øjeblikket bare at pege på nogle tilfældige hukommelsesplacering og ingen plads er afsat til at holde noget på hukommelsesplacering påpeget af k. Det er grunden til det dør. Grunden til, at det doensn't dø (endnu) i eksemplet, hvor j er afsat plads, er, at der i det mindste nogle rum fordelt på stakken, og k er sandsynligvis accidently peger der, og hertil korrumperende j, men ikke forårsager en segv (endnu). Jeg foreslår, at du går undersøgelse op om forskellene på * k, k [10] k [10,10] og ** k. Når du forstår, hvad disse forskellige former betyde, you're sysadmin vil have en meget bedre dag. |
![]() |
| Bogmærker |
| Thread Tools | Søg denne tråd |
| Display Modes | Bedøm denne tråd |
|
|