gioco codice C

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Oggi per noia mi son messo a creare questo codice malvagio vince chi mi sa dire cosa succede riga per riga senza usare un compilatore e leggendo tutto da questa pagina senza cercare altrove.
RIASSUNTO:

-Commentare riga per riga costa sta accadendo
es: #include <stdio.h> --> includo la libreario standard input output per usare poi printf.
-Visualizzare il codice solo qui
-Non usare un compilatore
Codice:
#include <stdio.h>

#define BUFFSIZ 2
long arr[BUFFSIZ];
int main(){
  arr[3] = 3;
  printf("%u\n", sizeof(arr) / 8);
  printf("%d\n", printf("%d\n", arr[3]));
  return 0;
}
 
Ultima modifica:
  • Mi piace
Reazioni: VidRam

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
ma...
di sabato notte alle 2:02 (o se preferisci di domenica mattina alle 2.02) correre dietro a qualche bella figliola proprio no? :ok:
 
  • Mi piace
Reazioni: Hobet

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
ma...
di sabato notte alle 2:02 (o se preferisci di domenica mattina alle 2.02) correre dietro a qualche bella figliola proprio no? :ok:
E mai poi l'affitto chi me lo paga? :hihi:
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Butto giù 2 righe in base ai ricordi lontanissimi del mio (ex) C
tutte le #define definiscono costanti/macro sebbene non mi sia chiara la
#define www'.'tomshw'.'it --> che mi sembra definisca solo un nome bizzarro (e null'altro) a meno che non ci sia qualcosa che (probabilmente) mi sfugge
poi c'è definito un array di long di dimensione 2 (2 long)
https: è un'etichetta, il resto è un commento "truccato" da "resto di url" perché non ci hai messo lo spazio
printf("%u\n", sizeof(arr) / 8); stampa la dimesinone in byte di arr divisa per 8; il risultato dipende dalla dimensione in byte di un long (in C minimo 32 bit=4 byte per ogni long ma non è detto, magari il compilatore usa 8 byte come Java); in parole povere stampa 1 se long è da 4 byte, altrimenti stampa 2.
NUM[arr] = 3; --> non la capisco, è come dire 3[3]=3 ma questi dettagli non li ricordo
printf("%d\n", printf("%d\n", *(NUM+arr))); --> NON LO SO, a parte che i miei ricordi dei dettagli sui puntatori sono lontanissimi confesso di non aver mai visto una printf annidata...

poi però ci dici la soluzione
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Butto giù 2 righe in base ai ricordi lontanissimi del mio (ex) C
tutte le #define definiscono costanti/macro sebbene non mi sia chiara la
#define www'.'tomshw'.'it --> che mi sembra definisca solo un nome bizzarro (e null'altro) a meno che non ci sia qualcosa che (probabilmente) mi sfugge
poi c'è definito un array di long di dimensione 2 (2 long)
https: è un'etichetta, il resto è un commento "truccato" da "resto di url" perché non ci hai messo lo spazio
printf("%u\n", sizeof(arr) / 8); stampa la dimesinone in byte di arr divisa per 8; il risultato dipende dalla dimensione in byte di un long (in C minimo 32 bit=4 byte per ogni long ma non è detto, magari il compilatore usa 8 byte come Java); in parole povere stampa 1 se long è da 4 byte, altrimenti stampa 2.
NUM[arr] = 3; --> non la capisco, è come dire 3[3]=3 ma questi dettagli non li ricordo
printf("%d\n", printf("%d\n", *(NUM+arr))); --> NON LO SO, a parte che i miei ricordi dei dettagli sui puntatori sono lontanissimi confesso di non aver mai visto una printf annidata...

poi però ci dici la soluzione
Aspetto qualche altra risposta e poi spiego tutto, comunque il compilatore può essere usato su :D .
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Se pazienti un po' - almeno sino al primo pomeriggio quando sarò in pausa pranzo - rispondo anche io. ;)
 
  • Mi piace
Reazioni: Hobet

Andretti60

Utente Èlite
6,440
5,091
3[arr] è un vecchio trucco. Espanso diventa *(3+arr), il compilatore interpreta 'arr' come un vettore, quindi lo sostituisce con l'indirizzo del primo elemento, 3 è un offset quindi viene moltiplicato per la dimensione degli elementi del vettore). In pratica è equivalente a arr[3]
Era possibile usarlo nel caro vecchio standard C, non so se viene riconosciuto dalle versioni più recenti. Di certo è un costrutto che se lo usi in un ambiente di lavoro vieni licenziato sul posto.
 

Andretti60

Utente Èlite
6,440
5,091
La hackerata più colossale comunque è accedere a un elemento del vettore al di fuori della sua lunghezza, poiché la dimensione del vettore 'arr' è 2, gli unici elementi sono 0 e 1. Il tutto non crolla se si sa cosa ci sia in memoria "dopo" il vettore arr. hackers usano spesso questo trucco per corrompere la memoria e accedere a parte che sarebbe a loro altrimenti vietata.
 

Andretti60

Utente Èlite
6,440
5,091
La cosa che non sapevo è il valore di ritorno di printf (usato nell'ultima istruzione), pensavo fosse lo stesso di scanf, ossia il numero di elementi stampati, invece è il numero di caratteri. Interessante che io non abbia mai controllato il ritorno di una istruzione printf :) potrebbe essere utile se si voglia stampare in memoria e quindi sapere quanta memoria si debba usare (anche se è possibile farlo con altri metodi)
 
  • Mi piace
Reazioni: DispatchCode

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
La cosa che non sapevo è il valore di ritorno di printf (usato nell'ultima istruzione)
Si infatti, quella istruzione non la capivo, anch'io non avevo mai fatto caso che ci fosse un valore di ritorno.
Uno di questi giorni rispolvero i miei vetusti appunti di C e gli dò un abella ripassata (insieme a un libro recente magari)
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Si infatti, quella istruzione non la capivo, anch'io non avevo mai fatto caso che ci fosse un valore di ritorno.
Uno di questi giorni rispolvero i miei vetusti appunti di C e gli dò un abella ripassata (insieme a un libro recente magari)
Non hai bisogno di nessun libro recente, per il C basta la "Bibbia" di Ritchie e Kernighan (e qui ci va la icona con il pollice sollevato)
 

Andretti60

Utente Èlite
6,440
5,091
ma...
di sabato notte alle 2:02 (o se preferisci di domenica mattina alle 2.02) correre dietro a qualche bella figliola proprio no? :ok:
io sabato notte "dopo" aver corso a qualche figliola (bella o brutta) ritornavo in dipartimento per programmare ancora un po' :) eravamo hacker giovani. Poi ci siamo sposati.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Purtroppo oggi non ho fatto in tempo ad intervenire. Avevo salvato la bozza in attesa di poterla completare, ma a quanto pare, sarebbe un intervento inutile. :)
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
io sabato notte "dopo" aver corso a qualche figliola (bella o brutta) ritornavo in dipartimento per programmare ancora un po' :) eravamo hacker giovani. Poi ci siamo sposati.
E pensare che viene compilato senza errori ahahahha
Codice:
int (*(*(*(*foo5(void))(void))(void))(void))(int i){
       return foo4;
}
 
  • Mi piace
Reazioni: Andretti60

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili