![]() |
|
|
google unix.com
|
|||||||
| Fórumok | Regisztráció | Fórum Szabályok | Linkek | Albumok | GYIK | Tagok listája | Naptár | Keres | Mai hozzászólások | Megjelöl Fórumok Olvas |
| Magas szintű Programozás Post kérdések C, C + +, Java, SQL, és más programozási nyelvek itt. |
Több, UNIX és Linux fórum témák Ön által talált Hasznos
|
||||
| Szál | Thread Starter | Fórum | Válaszok | Utolsó hozzászólás |
| Melyik Base Level Filesets szükség egy külön program? | cypher82 | A UNIX a fejlett és szakértői Felhasználók | 4 | 05-29-2008 09:07 AM |
| Segítség kell a C-program | dwgi32 | Magas szintű Programozás | 2 | 11-19-2007 10:44 AM |
| Furcsa dolog az FSS és VGS | mhenryj | AIX | 4 | 11-13-2007 04:42 PM |
| Furcsa eredményeket awk | amatheny | Shell programozás és Scripting | 2 | 11-01-2007 06:12 PM |
| Fura üzenet???? | lesstjm | A UNIX a dummies Kérdések és válaszok | 6 | 01-04-2002 10:01 AM |
![]() |
|
|
LinkBack | Téma eszközök | Keresés a téma | Rate Thread | Megjelenítési módok |
|
|
|
||||
|
Furcsa C program. Help Needed
Szia,
Kérjük, olvassa el ezt: Amikor egy nyilatkozatot: char * i, j [15], * k; majd ezt sprintf (k "print.sh% s", i); A program jól működik. De ha megváltoztatom a nyilatkozatot, hogy: char * i * k; majd ezt sprintf (k "print.sh% s", i); Kapok egy Segmentation fault a "sprintf" kijelentés. A program csak akkor működik, ha j tömb 15. Semmi kevesebb / több ![]() Figyelem: j változó csak egy bábu. Én semmit vele. Is tudom, hogy használ sprintf ahogyan én, az illegális. A mutató, anélkül hogy bármit, mielőtt egy ilyen nyilatkozatot. Lehet, hogy hülye de valaki kérem, fejtse ki, miért ez történik? Találd meg valamit csinálni, hogy memóriája van elkülönítve.Thanks in advance! |
|
||||
|
Akartál írni véletlenszerű memória a "k" nem mutatott semmit. A kernel beállítása három választ ...
(a) let you do it (b) a csapda, mert írásban csak olvasható memóriát, például a program image (c) a csapda, mert a memória írás, amelyet nem osztottak ki az Ön számára |
|
||||
|
Nos, a fenti sorokat, tudtam tovább le:
1. egy esetben a K mutatott stdout (dont know-how-ját!), coz a memória tartalma az volt, hogy az én printf nyilatkozata előtt az sprintf. (Meglepő!) 2. Az egyik esetben, k mutatott a karakterlánc része a sprintf nyilatkozatot. Ezért újra, akkor nem illegális, és a program nem működik. (Úgy látszik ez lehetséges). Azonban ez a fajta szemetet initializations érvényes, de úgy tűnik, hogy csak akkor történhet meg, ha a változó j nyilvánította. Különben, a program leállítja a SEGV. De még mindig hiszem, hogy ez egy különleges és egyszeri eset. Találd ki, hogy ugyanezt a kódot ez nem működik, egy másik gép. (Mine is a Solaris). Any comments / bemenet / további betekintést anyone? |
|
||||
|
A verem, hogy a fő használ nem lesz érintetlen szűz memória, akkor használták fel, subroutine felhívja a Prolog program, tehát crt0.o (vagy akármi) előtt fő () is nevezik.
A memória valóban egy ismeretlen állapotú, de én meg pont, a tartalom is megismételhető, bizonyos feltételek mellett. Hívnám esetben deja vu. ![]() |
|
||||
|
hozzájárul
. Azonban az ismételt fut a program változók kiosztása ugyanolyan memória helyet.Még olvasatban nagy string (20 karakter), és azt eljuttatja sprintf, akkor meglepő, hogy hogyan nincs szegmentálási hibát. Egyszer majd, ha "K" mutatva stdout, a hosszát a memória kellene megsértését, és a program kellene SEGV igaz? Továbbá, ha egyáltalán "K" pontok stdout, hogy csinál egy síkban azonnal, azt fel kell gyorsítani az "K" ugye? coz lehet felülírni a korábbi tartalmát stdout. |
|
||||
|
Idézet:
Ön szerint gdb fut, és ha a dolgok tényleg megyünk? |
|
||||
|
Van egy probléma mindkét esetben. Az egyik az, hogy sikerült elkapni, a másik pedig nem.
"char * i, j [15], * k" mondja a következőket: Pont a memória és a felhívás, hogy a mutató i; Teret emlékére, hogy 15 karakter, és hogy ezt a területet j; és pont a memória és a felhívás, hogy a mutató k; Amikor megpróbálja do "sprintf (k" print.sh% s ", i);" Ön azt kérdezi, hogy a számítógép botot a string "print.sh? A memória hely, rámutatott, hogy a mutató változó k. A te bajod, hogy nem juttatott olyan térben, hogy a string a mutató helyét k, k jelenleg csak mutatott néhány véletlenszerű memória helyét, és nem tér már kiosztott, hogy valamit a memória helyét jelzi, hogy a k. Ez az oka, hogy meghal. Ennek az az oka, hogy doensn't die (még) a példa, ahol j kijelölt helyen van, hogy legalább néhány helyet osztottak ki a veremből, és k valószínűleg véletlenül mutat ott, és ennek corrupting j, de nem okoz segv (még). Azt javasoljuk, hogy menjen fel a tanulmányi különbségek * k, k [10], k [10,10] és ** k. Ha érti, mi ezeket a különböző formáit jelenti, te sysadmin lesz sokkal jobb napot. |
![]() |
| Könyvjelzõk |
| Téma eszközök | Keresés a téma |
| Megjelenítési módok | Rate this thread |
|
|