Newsgroup: it.comp.lang.c
Titolo: MALLOC(0) AIUTO!!!!!!

Mi spiegate come è possibile ke funzioni questo programmino?
int *numero
numero=(int*)malloc(1);
printf("inserisci numero"); //inserisco 1012310230
scanf("%d", p);
printf("il numero è %d", *p); // e stampa correttamente il num
Come è possibile che riesco a mettere nella zona di memoria
puntata da p un dato molto piu' grande di quanto ho allocato con
malloc (1 byte) ???
Il programma funziona!!!
Mi hanno detto prova a fare un free e vedrai ke ti da errore,
perchè quando va a liberare la zona di memoria allocata non trova
più i bordi del file(o qualcosa del genere). Ho provato così e
funziona anche quello!!!
free (numero);
printf("se la zona di memoria punt. da numero è stata liberata
        *numero è 0: %d" , *numero) // ed è zero!!
Quindi libera! Altro che errori!! anche perchè commentando il free *numero
il mio numero torna sempre.
Dunque vi chiedo aiuto nel risolvere questo mistero...
Per favore non fate solo supposizioni.... qualcuno ke lo sa sul serio???
E poi ke mi spieghi anche questo malloc(0) funziona! allo stesso modo
dell'esempio precedente!!!! :-) Come è possibile??????????????

 Il programma funziona!!!
Probabilmente e' un problema di allineamento. La malloc
non sa a cosa ti serve il dato ed e' probabile che allochi le
cose allineate a blocchi superiori ad 1 byte. Quindi e'
come se ne allocasse sempre almeno 4.
Poi in generale scrivere dove non dovresti non da' sempre
errore perche' potresti andare a scrivere in una zona dove
comunque non dai fastidio (al momento). E' il motivo
per cui questo tipo di errore e' bastardo da debuggare.
ciao,g

 dell'esempio precedente!!!! :-) Come è possibile??????????????
se la dimenzione e' 0, malloc alloca un elemento di lunghezza zero
(sull'heap) e ritorna un puntatore valido a tale elemento.
Questo spiega perche' ottieni un puntatore valido.... il fatto che il
programma funzioni e' pura fortuna, come per prima,.... (anche se per
programmi piccoli e banali e' molto facile che funzioni).
Per finire in C non serve il cast per la malloc. Stai probabilmente usando
un compilatore C++.
Tommy

 dell'esempio precedente!!!! :-) Come č possibile??????????????
Questa e' una storia meno semplice. Poiche' lo standard non dice nulla 
di malloc(0), il risultato e' implementazione-dipendente. Puo' dare NULL 
o puo' dare un indirizzo valido di una regione di memoria di dimensione 
nulla. Ci sono pro e contro per ciascuna soluzione. Se cerchi con google 
malloc(0) troverai tutto quello che potresti voler sapere e anche di piu'.
Giorgio

 programmi piccoli e banali e' molto facile che funzioni).
mi sovviene ora, grazie ad un altro post (di Giorgio) che mi ha fatto
ricordare cose nascoste in qualche neurone remoto, che e' la soluzione
adottata dalla maggior parte dei compilatori ma lo standard non e' molto
chiaro a riguardo.
lo standard C99 dice:
<QUOTE>
The malloc function allocates space for an object whose size is specified by
size and
whose value is indeterminate.
</QUOTE>
e da questa frase sembra che l'unica soluzione accettabile con malloc(0) sia
quella descritta sopra.
Poi pero' dice:
<QUOTE>
The malloc function returns either a null pointer or a pointer to the
allocated space.
</QUOTE>
che in teoria renderebbe possibile anche ritornare NULL con malloc(0).
In pratica malloc(0) potrebbe sempre ritornarti NULL o ritornare un
indirizzo. Dipende dalla implementazione. Qualsiasi implementazione che
segua lo standard deve adottare una delle due soluzioni qui descritte.
Tommy

 dell'esempio precedente!!!! :-) Come è possibile??????????????
Dallo standard:
        7.20.3  Memory management functions
        [...]
        If the size of the space requested is
        zero, the behavior is implementation-defined: either a  null
        pointer  is returned, or the behavior is as if the size were
        some nonzero value, except that the returned  pointer  shall
        not  be  used  to  access an object.                   ^^^^^
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Usando il puntatore ottenuto da malloc(0) produci comportamento 
indefinito (vedi sopra).

 </QUOTE>
piu' esplicito questo quote a riguardo:
<QUOTE>
If the size of the space requested is zero, the behavior is
implementationdefined:
either a null pointer is returned, or the behavior is as if the size were
some
nonzero value, except that the returned pointer shall not be used to access
an object.
</QUOTE>
Tommy

 Dunque vi chiedo aiuto nel risolvere questo mistero...
quello che ho detto io vale per la mia architettura, per il mio computer:
non posso assolutamente dire che sia standard e che č lecito
aspettarsi un simile comportamento su ogni macchina.. tuttavia questo č
quello che forse accade anche a te.
leggiti qualcosa circa l'implementazione della malloc relativa alle tue
libc.
Ciao
Matico

 </QUOTE>
Ok dunque lo standard dice: se la dimensione dello spazio richiesto è zero 
il comportamento è a discrezione dell'implementazione: o viene tornato un
puntatore a null oppure il comportamento è come se la dimensione (ke ho
indicato io presumo) fosse un valore diverso da zero..... poi?????
except....??
Dice che il puntatore non dovrà essere usato o significa "tranne nel caso in
cui venga usato"??
Grazie in anticipo...
Alf.

 Matico
Ciao bello,
Alf

 caso in cui venga usato"??
Puoi usarlo, non puoi dereferenziarlo.
Luca
[1]  Una  considerazione: IMHO  e`   molto  istruttiva  una  gita  nella
programmazione a  livello di kernel. Qui` undefined  behaviour vuol dire
che  nella migliore  delle ipotesi  si blocca  la macchina. Se  va male,
invece, dici addio al filesystem.
-- 
Home: 
http://kronoz.cjb.net
Se non puoi convincerli, confondili.

 cui venga usato"??
dice che tale puntatore non dovra' pero' essere utilizzato per accedere
all'oggetto in quanto il byte a cui punta non e' stato di fatto allocato.
(in teoria).
Tommy

 anche accedere a ?) la zona 4 bytes dopo a cui essi si riferiscono?
Tutto questo discorso ha poco a che fare con quello che volevi sapere e con
il C in generale. Od ogni modo quello che dice e' piu' o meno vero. Per ora
non fa pero' altro che confonderti le idee...
Ad esempio su windows malloc() non fa altro che chiamare una chiamata del
sistema operativo HeapAlloc(). Dopo di che quello che succede a poco a
vedere con il C e molto con il sistema operativo windows.
Una lettura poco impegnativa ma fatta relativamente bene a riguardo e':
Memory Management: Algorithms and Implementation in C/C++ by Bill
Blunden.... ma per ora concentrati sul C.
Tommy

 Tommy
Ciao, Alf.

 Tommy
Oki, tnx
Ciao, Alf

 No perchè fin qui, non hai aggiunto nulla :-)
gia'!
Tommy

 
[snip]
per chiudere il discorso (spero :) )dico solo che Matic s'č sbagliato :P
pensava di essere su un altro newsgroup piu specifico, quindi quello che
ha detto lui ignoralo. Ricapitolo e poi basta: il motivo per cui "ti
funziona" č da ricercare nel modo in cui il tuo sistema operativo
gestisce la memoria, discorso che non c'entra niente con questo newsgroup
che parla di _standard_ C, e che pertanto sarebbe ot.
Ciau !
Matic

 Matic
Ok, sono d'accordo, il discorso è durato fin troppo e posso dire aver
chiarito i miei dubbi + funnzionali :-)
Grazie a tutti e ciao!
Alf