Newsgroup: it.comp.lang.c
Titolo: malloc che inizializza a zero?? era calloc!

problema: il ms vc++ mi compila bene questo programmino:
#include <stdio.h>
#include <stdlib.h>
/*
#include <malloc.h>
*/
main () {
int nbyte=1024*1024*2;
FILE *fp;
char *point;
point=malloc(sizeof(char)*nbyte);
if( point == NULL )
 printf( "Insufficient memory available\n" );
else
 {
 fp = fopen("outfile", "w");
 fwrite(point,sizeof(char)*nbyte,1,fp);
 fclose(fp);
 free(point);
 }
printf("done");
}
poi pero andando a vedere il file "outfile", e' tutto pieno di 0!
invece dovrebbe essere un file pieno di byte random, per come
e' definita malloc sul libro di K&R... o sbaglio??
grazie
ferdyz

 e' definita malloc sul libro di K&R... o sbaglio??
Il contenuto di una zona di memoria allocata con malloc non è definito.
Dentro puoi trovarci tutti zeri, byte random, o la formula per creare la
pietra filosofale, ma non puoi contare su nessuna di queste cose.
Saluti,
Lanugo

 poi pero andando a vedere il file "outfile", e' tutto pieno di 0!
(S)fortuna.
A me ad esempio ha salvato un file con alcuni byte "sporchi" e il resto
a 0.
L'unica per essere sicuri e' la calloc, o una memset dopo la malloc
--
-=[]=- 
ian...@libero.it
 -=[]=-

 ha scritto
nel messaggio news:XrfW8.162392$B%3.4...@atlpnn01.usenetserver.com...

magari! e' proprio quello che voglio.
invece ho provato ad allocare 256Mbyte di ram.
la malloc l'ha fatto e il programmino mi ha creato il file.
ebbene... erano 256 milioni di zero!
a questo punto visto che la statistica non e' un'opinione,
suppongo che il ms vc++ forzi la malloc a inizializzare a 0
tutti i byte allocati, in barba a quello che si dice nel MSDN...
che ne pensi?
ferdyz

 ebbene... erano 256 milioni di zero!
Ci  possono   essere  diverse   spiegazioni. Prima  di  tutto   prova  a
ricompilare  in  modalita`  'release',  perche` in  modalita`  debug  il
VC++  inizializza la  memoria con  pattern vari  per rilevare  possibili
sforamenti o utilizzi errati della memoria.
Se stai utilizzando  Win{NT, 2K, XP} allora il  'problema' e` imputabile
ai  meccanismi di  sicurezza del  sistema. Questi sistemi  sono conformi
alle specifiche  DoD 5200.28-STD che  prevedono, tra le altre  cose, che
ogni pagina  di memoria  debba essere azzerata  prima di  essere mappata
nello spazio di indirizzamento del programma.
Quello che accade nel tuo caso e` che la malloc richiede memoria all'OS,
che fornisce una (o piu`) pagine azzerate.
Prova questo programma:
int main() {
        int *p;
        int i;
        p = malloc(10 * sizeof(int));
        printf("p = %p\n", p);
        for (i = 0; i < 10; i++)
                p[i] = i;
        free(p);
        p = malloc(10 * sizeof(int));
        printf("p = %p\n", p);
        for (i = 0; i < 10; i++)
                printf("%d ", p[i]);
        printf("\n");
        free(p);
}
In  questo caso  *dovrebbe* [1]  venire riutilizzata  la stessa  area di
memoria (lo  verifichi tramite le  due printf). Visto che  nella seconda
allocazione  non  entra  in  gioco  l'OS dovresti  essere  in  grado  di
rileggere quello che hai scritto.
Attenzione  che quello  qui`  sopra  non e`  certo  un  buon esempio  di
programmazione: sto  leggendo da  un'area di memoria  potenzialmente non
inizializzata.
[1] L'allocatore potrebbe anche decidere di restituire la pagina all'OS,
ma mi sembra improbabile.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Do, or do not. There is no try.

 ai  meccanismi di  sicurezza del  sistema. Questi sistemi  sono conformi
gia. credo che il "problema" sia infatti l'os, ovvero win2k.
infatti ho provato il programmino sotto win98 e funziona
(ovvero il file creato e' bello sporco).
inoltre ho provato a usare anche il djgpp, e i risultati sono identici.
ovvero, sotto w98 file riempito con byte random, e sotto w2k
tutti zeri.
non sapevo dei meccanismi di sicurezza da te citati, ma ne avevo
intuito l'esistenza :)
grazie del feedback
ciao
ferdyz