Newsgroup: it.comp.lang.c
Titolo: Problemi di allocazione memoria

Ciao a tutti!
Ho un piccolo problemino...
Questo e' il sorgente:
#include <stdio.h>
#define SIZE    144000
main()
{
  char* buf;
  buf = (char*) malloc(sizeof(char) * SIZE);
  if(buf != NULL)
  {
    printf("Alloc!\n");
    printf("Memset...\n");
    memset(buf, 0, SIZE);
    printf("Free...\n");
    free(buf);
  }
  else
    printf("Fehler!\n");
}
Il programmello viene compilato su una macchina a 64 Bit (AMD Opteron).
Durante la compilazione ottengo l'errore:
x.c: In function `main':
x.c:9: warning: cast to pointer from integer of different size
e, quando lo lancio, ottengo:
Alloc!
Memset...
Segmentation fault
Ora, sicuramente il segmentatin fault dipende da quel warning...
Qualcuno sa dirmi cosa c'e' di cosi' sbagliato nel codice?
Su macchine a 32 bit funziona senza problemi...
Grazie
Luca Bertoncello
(
luca...@lucabert.de
)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

OK! Dimenticate il tutto!
Ho dimenticato di includere stdlib.h...
Inclusa e tutto funziona alla perfezione!
Scusate il disturbo!


 Ho dimenticato di includere stdlib.h...
A dimostrazione che in C il cast sul valore di ritorno della malloc
*non* va messo.
Luca
-- 
Porc i' mond che cio' sott i piedi!
V. Catozzo

 }
Premesso che non credo di spiegare con ciò l'errore che Luca si trova
davanti, il mio dubbio è nella chiamata a memset.
Il terzo argomento dovrebbe rappresentare il numero di byte da azzerare.
Ora, in C, non è detto che un char sia rappresentato con un solo byte
(spero di non dire cavolate), per questo suppongo la chiamata corretta
dovrebbe essere:
memset(buf, 0, SIZE*sizeof(char));
Perdonate la mia pignoleria (c'ho perso 3 punti all'esame per il mancato uso
di sizeof in una malloc!), spero di aver contribuito ad evitare qualche
noioso bug. Purtroppo non posso provare la mia affermazione disponendo solo
di architetture IA32, spero quindi, possiate togliermi il piccolo dubbio.
Ciao a tutti e buona Pasqua!
Giuseppe Puoti

 memset(buf, 0, SIZE*sizeof(char));
sizeof(char) è 1 per definizione. La dimensione del char è esattamente
1 byte. Non è fissato a priori il numero di bit che compongono il byte.
Luca
-- 
Let me make your mind, leave yourself behind
Be not afraid

> Non è fissato a priori il numero di bit che compongono il byte.
ma 1 byte non sono 8 bit? 

 ma 1 byte non sono 8 bit? 
No. Nel campo delle telecomunicazioni, ad esempio, si parla di ottetti
proprio per evitare confusione. Esistono architetture a "9 bit" (i PDP e
alcuni mainframe di Honeywell e IBM ad esempio), anche se è vero che
oggi sono molto poco popolari. Potrebbero esserci architetture che usano
un numero maggiore di bit, ma al momento non me ne vengono in mente.
Nel campo embedded esistono processori con meno di 8 bit per byte
(tipicamente 4), ma IIRC lo standard richiede un minimo di 8 bit, questi
microprocessori hanno tipicamente un DK ad hoc.
Luca
-- 
Alcuni pensano che io sia una persona orribile, ma non e` vero. Ho il
cuore di un ragazzino - in un vaso sulla scrivania.

di sizeof in una malloc!)
Spero non fosse questo il caso, perché altrimenti i 3 punti bisogna
toglierli al professore :-)
Come ha già detto Kronos, sizeof(char) è comunque è sempre uguale a 1
byte, anche se non è detto che un byte occupi 8 bit.