The UNIX and Linux Forums  


Go Back   UNIX og Linux Forums > Top Forums > HøjtstÃ¥ende Programmering
.
google unix.com



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

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Søg denne tråd Rate Thread Display Modes
  #1 (permalink)  
Old 11-14-2007
karthikb23 karthikb23 is offline
Registreret Bruger
  
 

Join Date: Nov 2007
Stillinger: 18
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!
  #2 (permalink)  
Old 11-14-2007
porter porter is offline Forum Advisor  
Registreret Bruger
  
 

Join Date: Jan 2007
Stillinger: 2965
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
  #3 (permalink)  
Old 11-14-2007
karthikb23 karthikb23 is offline
Registreret Bruger
  
 

Join Date: Nov 2007
Stillinger: 18
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?
  #4 (permalink)  
Old 11-14-2007
porter porter is offline Forum Advisor  
Registreret Bruger
  
 

Join Date: Jan 2007
Stillinger: 2965
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.
  #5 (permalink)  
Old 11-14-2007
karthikb23 karthikb23 is offline
Registreret Bruger
  
 

Join Date: Nov 2007
Stillinger: 18
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.
  #6 (permalink)  
Old 11-14-2007
porter porter is offline Forum Advisor  
Registreret Bruger
  
 

Join Date: Jan 2007
Stillinger: 2965
Citat:
Oprindeligt Indsendt af karthikb23 View Post
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.
Prøv og se ...?

Er du kører det under gdb og se, hvor tingene er egentlig hen?
  #7 (permalink)  
Old 11-14-2007
n1djs n1djs is offline
Registreret Bruger
  
 

Join Date: Nov 2007
Stillinger: 12
Smile Weird C program. Help Needed

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.
Closed Thread

Bogmærker

Thread Tools Søg denne tråd
Søg denne tråd:

Avanceret søgning
Display Modes Bedøm denne tråd
Bedøm denne tråd:

Udstationering Regler
Du kan ikke post nye tråde
Du kan ikke post svar
Du kan ikke post vedhæftede filer
Du kan ikke redigere dine indlæg

BB-kode er PÃ¥
Smilies er PÃ¥
[IMG] koden er PÃ¥
HTML-koden er Slukket
Trackbacks er PÃ¥
Pingbacks er PÃ¥
Refbacks er PÃ¥




Alle tidspunkter er GMT -4. Den tid er nu 03:25 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Oversættelser Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. Alle rettigheder Reserved.Ad Management ved RedTyger

Content Relevant webadresser ved vBSEO 3.2.0