PDA

View Full Version : assegnazione indirizzo a un puntatore


alderighi
08-06-2003, 14:52
Con dei miei amici dopo aver fatto i puntatori in C a scuola abbiamo pensato di fare un programma che scancellasse casualmente parti di memoria ram, volendo vedere come si comportava un computer e volendo fare degli scherzi :D :D :D .

Il codice è questo:

# include <conio.h>
# include <stdio.h>
# include <string.h>
# include <iostream.h>
# include <dos.h>
# include <stdlib.h>
//Alderighi Matteo III A inf
int tempo,*p,n=0;
void main()
{
printf("Dammi ogni quanti secondi vuoi pulire la ram? ");
scanf("%d",&tempo);
clrscr();
printf("Pulitura casuale della ram ogni %d secondi",tempo);
randomize();
for(p=0000;n<1000;(p=p+random(10000)),n++)
{
printf("\nPulitura casuale %d, indirizzo %x",n,p);
free(p);
sleep(tempo);
}
getch();
}
Qual'è la sintassi, il modo, l'operatore logico per assegnare un indirizzo digitato da tastiera o messo da me nel codice a mano ad un puntatore,
ho provato con p=9000 ma non funziona, funziona solo p=0 :muro: :muro: :muro: .
Aiutatemi!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

cionci
08-06-2003, 15:00
Prova così:

char *p = (char *)9000;

alderighi
08-06-2003, 15:29
grazie dell'aiuto ora funziona, non miera venuto in mente di fare il cast.

mjordan
08-06-2003, 20:02
Originally posted by "alderighi"

Con dei miei amici dopo aver fatto i puntatori in C a scuola abbiamo pensato di fare un programma che scancellasse casualmente parti di memoria ram, volendo vedere come si comportava un computer e volendo fare degli scherzi :D :D :D .

Il codice è questo:

# include <conio.h>
# include <stdio.h>
# include <string.h>
# include <iostream.h>
# include <dos.h>
# include <stdlib.h>
//Alderighi Matteo III A inf
int tempo,*p,n=0;
void main()
{
printf("Dammi ogni quanti secondi vuoi pulire la ram? ");
scanf("%d",&tempo);
clrscr();
printf("Pulitura casuale della ram ogni %d secondi",tempo);
randomize();
for(p=0000;n<1000;(p=p+random(10000)),n++)
{
printf("\nPulitura casuale %d, indirizzo %x",n,p);
free(p);
sleep(tempo);
}
getch();
}
Qual'è la sintassi, il modo, l'operatore logico per assegnare un indirizzo digitato da tastiera o messo da me nel codice a mano ad un puntatore,
ho provato con p=9000 ma non funziona, funziona solo p=0 :muro: :muro: :muro: .
Aiutatemi!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Scusa eh, non per qualcosa, ma questo è un programma concettualmente totalmente sbagliato.

mattomatt
09-06-2003, 18:51
Concordo completamente con mjordan.
aggiungo che non conosco il verbo "scancellare" e che con il c si possono fare scherzi mooooolto più simpatici ;) ma è meglio nn farli! :)

alderighi
11-06-2003, 15:04
Sono disposto ad accettare consigli ( :sofico: lo so che si poteva agire anche suul'hrad-disk scancellando dati ma non mi interessa :sofico: ), non capisco tutto questo accanimento contro il mio povero :cry: :mad: programma che funziona a dovere :D e concettualmente ho usato le regole basilari.
Comunque se volete dare qualche consiglio :confused: , anzi perchè non postate un vostro programma fatto da voi visto che siete tanto esperti e bravi :D ?!?!?!

Il verbo scancellare è usato moltissimo in Toscana e come si sa il l'italiano deriva dal toscano, inoltre se in un forum uno deve stare attento a tutto e non può scrivere come qli pare, inoltre ho visto gente scrivere molto peggio e usare verbi inesistenti.

Inoltre riporto da vocabolario: :D :D :D :sofico: :D :D :D
scancellare=Forma intensiva e più espressiva di cancellare. :sofico:

cionci
11-06-2003, 16:19
Semplicemente perchè la free non libera la memoria...ma solamente dealloca uno spazio di memoria allocato dal programma stesso...i valori rimangono comunque lì anche dopo la free...

lombardp
11-06-2003, 16:58
Originally posted by "cionci"

Semplicemente perchè la free non libera la memoria...ma solamente dealloca uno spazio di memoria allocato dal programma stesso...i valori rimangono comunque lì anche dopo la free...

Si, infatti. La FREE del programma semplicemente non ha alcun effetto. Se poi si è nel caso di sistema operativo con memoria protetta, anche se funzionasse, potrebbe solo deallocare la propria memoria, non certo quella di altri programmi.

alderighi
12-06-2003, 08:31
Ho capito, grazie!
Quando avvio il programma dopo un po' mi da due o tre errori,
per esempio:
PUNTARAM ha provocato un errore di pagina non valida nel
modulo PUNTARAM.EXE in 01a7:00409e9a.
Registri:
EAX=fffffffe CS=01a7 EIP=00409e9a EFLGS=00010282
EBX=0040e9d8 SS=01af ESP=0064fde8 EBP=0064fdec
ECX=0064f888 DS=01af ESI=0040c100 FS=1aa7
EDX=bffc9490 ES=01af EDI=0040c104 GS=0000
Byte all'indirizzo CS:EIP:
8b 08 f6 c1 02 74 33 8b d0 2b 50 fc 83 e1 fc 83
Immagine dello stack:
0040e9d8 0064fe04 0040119a 00000002 00000000 0040c0b8 00000000 0064fe30 0040b451 00000001 006621a4 006623a4 00000000 8189b4d4 00540000 00000000

mjordan
12-06-2003, 09:20
Originally posted by "alderighi"

Ho capito, grazie!
Quando avvio il programma dopo un po' mi da due o tre errori,
per esempio:
PUNTARAM ha provocato un errore di pagina non valida nel
modulo PUNTARAM.EXE in 01a7:00409e9a.
Registri:
EAX=fffffffe CS=01a7 EIP=00409e9a EFLGS=00010282
EBX=0040e9d8 SS=01af ESP=0064fde8 EBP=0064fdec
ECX=0064f888 DS=01af ESI=0040c100 FS=1aa7
EDX=bffc9490 ES=01af EDI=0040c104 GS=0000
Byte all'indirizzo CS:EIP:
8b 08 f6 c1 02 74 33 8b d0 2b 50 fc 83 e1 fc 83
Immagine dello stack:
0040e9d8 0064fe04 0040119a 00000002 00000000 0040c0b8 00000000 0064fe30 0040b451 00000001 006621a4 006623a4 00000000 8189b4d4 00540000 00000000

Appunto e' totalmente sbagliato. In questo programma esistono 4 violazioni. Prima: La memoria va allocata con malloc, realloc o calloc prima di chiamare free(). free() non cancella, dealloca. Per deallocare, bisogna allocare.

Seconda: Generare un indirizzo random ti porta a puntare in uno spazio di memoria al di fuori di quella assegnata dal sistema operativo. Quello che in Windows ti dice pagina non valida, sotto Unix si chiama errore di segmentazione.

Terza: Nel caso i puntatori non causino un segfault puntando al di fuori della memoria allocata dal sistema operativo per il tuo programma, essi sicuramente cancelleranno locazioni di memoria contenenti indirizzi del programma stesso, causando un'autocorruzione.

Quarta: Non puoi danneggiare nessun hard disk in questo modo.

In sostanza, non è che sei arrivato tu a scrivere un garbage collector in 10 righe di codice

:D :D :D

alderighi
12-06-2003, 15:11
Lo so che in questo modo non si può scancellare nulla dall'hardisk, ma mi riferivo al tuo riferimento di scherzi più belli e pesanti, per fare un programma così bisognerebbe adoprare l'assembler comunque vorrei senza tanti casini fare un programma semplice che ha lo scopo di cancellare parti di ram a caso anche di altri programmi quindi la malloc non serve a nulla(è inutile scancellare un'area da noi allocata non creerà nessun errore), il programma funziona solo che non riesce a scancellare perchè windows interviene prima dando un errore e io che ci posso fare,
se sapete altri modi per scancellare parti di ram allocte da altri programmi senza che windows intervenga ditemelo.

alderighi
12-06-2003, 15:13
Lo so che in questo modo non si può scancellare nulla dall'hardisk, ma mi riferivo al tuo riferimento di scherzi più belli e pesanti, per fare un programma così bisognerebbe adoprare l'assembler comunque vorrei senza tanti casini fare un programma semplice che ha lo scopo di cancellare parti di ram a caso anche di altri programmi quindi la malloc non serve a nulla(è inutile scancellare un'area da noi allocata non creerà nessun errore), il programma funziona solo che non riesce a scancellare perchè windows interviene prima dando un errore e io che ci posso fare,
se sapete altri modi per scancellare parti di ram allocte da altri programmi senza che windows intervenga ditemelo.

lombardp
12-06-2003, 16:33
Originally posted by "alderighi"

il programma funziona solo che non riesce a scancellare perchè windows interviene prima dando un errore e io che ci posso fare,
se sapete altri modi per scancellare parti di ram allocte da altri programmi senza che windows intervenga ditemelo.

Quello che volevano e volevo cercare di dirti è che il programma non ha proprio fondamento logico. Windows (ma anche gli altri OS) gestisce ogni applicazione in una vera e propria scatola chiusa (memoria protetta), nel senso che ciascuna applicazione ha "virtualmente" tutta la memoria a disposizione e con tutta dico proprio tutta nel senso che può allocare in tutto lo spazio di indirizzamento teorico. Sarà poi il sistema operativo a "tradurre" l'indirizzo virtuale in quello fisico, secondo i suoi bisogni e in linea di principio variandolo a piacimento in modo trasparente durante l'utilizzo.

Quindi la locazione di memoria 13'456'721 dell'applicazione "pippo" NON COINCIDERA' MAI con la locazione 13'456'721 dell'applicazione "pluto" perché le due locazioni inizialmente identiche sono SEMPRE tradotte in locazioni fisiche DIVERSE.

Per accedere alla memoria di altri processi devi sostanzialmente eseguire codice a livello di kernel, come certi driver di basso livello.