Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air combina diverse carte molto interessanti: un OLED PaperMatte da 12 pollici, un corpo sottile e una tastiera molto comoda. Durante la prova abbiamo apprezzato fluidità, audio e comfort visivo, mentre i test hanno chiarito pregi e qualche limite nelle prestazioni. L'autonomia ha convinto anche nell'uso intermittente; la scelta passa dalla compatibilità delle proprie app e dal valore del pacchetto con accessori, proposto a 749 euro
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
Debuttano ufficialmente i primi sistemi notebook basati su piattaforma NVIDIA RTX Spark, abbinati a Windows on ARM e pensati per l'intelligenza artificiale agentica. Architettura integrata tra CPU e GPU che condividono la memoria di sistema, capace di gestire in locale modelli molto grandi ma al contempo anche di spiccare con la grafica e l'elaborazione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Abbiamo provato Motorola razr fold, il pieghevole a libro con display interno LTPO da 8,09 pollici, Snapdragon 8 Gen 5 e batteria da 6000 mAh in 243 grammi. Pennino e custodia sopno già nella confezione, per un foldable che si caratterizza per il pannello luminoso, l'autonomia ottima per la categoria e le fotocamere coerenti e ben sfruttabili. Il listino è di 1999 euro, ma in vendita si trova già a molto meno
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-04-2009, 20:38   #1
EdgarVillier
Junior Member
 
Iscritto dal: Sep 2007
Messaggi: 20
[C] - Allocazione Dinamica di strutture

Ho trovato su libro un esempio in C che non ho capito, ed'è sull'allocazione dinamica di una struct, nel libro la effettua così :

link t = malloc(sizeof * t);

Dove link è definito nel seguente modo :

typedef struct node* link; struct node{ int info; link next;}

Non capisco la sintassi in malloc(), da quello che sapevo sizeof(tipo_di_dato) accettava in ingresso il tipo di dato e lui ne restituisce la dimensione, ma qui non ho capisco lo si moltiplica per un puntatore a t??

Dalle mie conoscenze precedenti l'allocazione di una struttura aveva la seguente sintassi :

link t =(link) malloc(sizeof(node));

Dove si faceva il cast alla funzione malloc del tipo di dato da allocare con (link).

Grazie a tutti anticipatamente
EdgarVillier è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2009, 21:10   #2
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
In questa espressione, se t fosse definito come "link t", ti darebbe per forza un errore... infatti malloc viene eseguito prima, e POI viene copiato il risultato dentro al nuovo "link".
Quindi quel t che sta dentro il malloc è una variabile definita in precedenza

Cmq è strano, non dovrebbe essere possibile chiamare due variabili allo stesso modo.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2009, 21:28   #3
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
link t = malloc(sizeof * t);

t è dichiarato come link, quindi l'espressione equivalente è:

link t = malloc(sizeof * link);

* link dereferenzia link, che è un puntatore e quindi restituisce struct node

link t = malloc(sizeof struct node);

E' un metodo un po' strano per usare la malloc però...

Ultima modifica di ||ElChE||88 : 07-04-2009 alle 21:30.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2009, 21:41   #4
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
No non è possibile che faccia in quella maniera:

node* t;

questa espressione genera un garbage pointer, tipo 0xcdcdcdcd... t non è inizializzato.
Allo stesso modo, nell'espressione di prima t malloc serve proprio ad inizializzare t, quindi usare t nell'espressione che lo inizializza è quanto di più sbagliato.
deferenziarlo semplicemente manda tutto in crash, nel migliore dei casi...

direi che a questo punto ci serve tutto il codice
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2009, 22:00   #5
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Quote:
Originariamente inviato da Tommo Guarda i messaggi
No non è possibile che faccia in quella maniera:

node* t;

questa espressione genera un garbage pointer, tipo 0xcdcdcdcd... t non è inizializzato.
Allo stesso modo, nell'espressione di prima t malloc serve proprio ad inizializzare t, quindi usare t nell'espressione che lo inizializza è quanto di più sbagliato.
deferenziarlo semplicemente manda tutto in crash, nel migliore dei casi...

direi che a questo punto ci serve tutto il codice
Prova questo:
Codice:
#include <stdlib.h>
#include <stdio.h>

typedef struct node* link;
struct node { int info; link next; };

int main()
{
	link t1 = malloc(sizeof * t1);
	link t2 = malloc(sizeof * t2);
	t1->info = 2;
	t1->next = NULL;
	t2->info = 5;
	t2->next = NULL;

	printf("%X\n", t1);
	printf("%d\n", t1->info);
	printf("%d\n", t1->next);
	printf("%X\n", t2);
	printf("%d\n", t2->info);
	printf("%d\n", t2->next);
	system("pause");
}


Edit: Comunque il sizeof viene eseguito a compile time, quindi parlare di garbage pointers non ha senso...

Ultima modifica di ||ElChE||88 : 07-04-2009 alle 22:09.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2009, 02:22   #6
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Non sapevo che il sizeof fosse eseguito a compile time

In più non conoscevo la sua sintassi senza parentesi...

Cmq rimane che il libro è meglio bruciarlo, quella sintassi fa schifo, ed è inutilmente complicata!
Poteva usare direttamente il typename, poteva mettere le parentesi, poteva non fare typedef di un pointer (nascondere che un pointer è un pointer è sbagliato).
Cosa aveva contro

node* t = (node*)malloc( sizeof( node ) );

Si capisce perfettamente cosa fa e fa la stessa cosa. Mah.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2009, 10:47   #7
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Cmq rimane che il libro è meglio bruciarlo, quella sintassi fa schifo, ed è inutilmente complicata!
Ma infatti... una cosa del genere scritta in un libro mi fa venire voglia di prendere a martellate nei denti l'autore.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2009, 19:50   #8
EdgarVillier
Junior Member
 
Iscritto dal: Sep 2007
Messaggi: 20
Anzitutto, ringrazio tutti per le risposte, adesso però ho qualche altro quesito per chiarire :

link t = malloc(sizeof * t);

t è dichiarato come link, quindi l'espressione equivalente è:

link t = malloc(sizeof * link);

* link dereferenzia link, che è un puntatore e quindi restituisce struct node

quindi *link serve a deferenziare link ed a ottenere struct node.

La cosa che ancora non ho capito è perchè non è necessario fare il cast :

link t =(link) malloc(sizeof(node));

Grazie ancora
EdgarVillier è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2009, 23:18   #9
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4908
Quote:
Originariamente inviato da EdgarVillier Guarda i messaggi
La cosa che ancora non ho capito è perchè non è necessario fare il cast :

link t =(link) malloc(sizeof(node));

Grazie ancora
In C per trasformare un void* (il tipo ritornato dalla malloc) in un qualsiasi altro puntatore non c'è bisogno del cast esplicito.
In C++ invece dovresti scriverlo.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2009, 02:13   #10
EdgarVillier
Junior Member
 
Iscritto dal: Sep 2007
Messaggi: 20
Ok, perfetto grazie mille a tutti per avermi chiarito entrambi i dubbi. Anche se effettivamente la sintassi non è chiara adesso penso di aver capito meglio l'allocazione dinamica.
EdgarVillier è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
OpenAI, un modello GPT-5.6 Sol ha usato ...
Google testa Ask Google Help: l'IA di Ge...
Apple aggiorna l'elenco dei prodotti obs...
Renault 5 si aggiorna anche in Italia: p...
L’IA fa il lavoro dei junior. Ma le impr...
Google riduce gli errori quantistici di ...
Xpeng Mona L05: un SUV da 4,87 metri con...
CERN e Mistral AI insieme per il primo L...
Le analisi approfondite sullo scudo term...
Chery Q arriva in Italia: 380 km, trazio...
Rocket Lab rinvia il primo lancio di Neu...
Tutti gli astronauti della missione spaz...
Agenti IA in azienda: il difficile non &...
Anthropic, New York chiede di rinviare l...
Meta aggiorna Edits con link audio, tend...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v