ho sempre programmato in Java, che è probabilmente il motivo per cui sono così confuso su questo:Sono molto confuso su malloc() e calloc() su C
In Java dichiaro un puntatore:
int[] array
e inizializzare o assegnarlo qualche ricordo:
int[] array = {0,1,0}
int[] array = new int[3]
Ora, in C, è tutto così confuso. In un primo momento ho pensato che fosse facile come dichiarandolo:
int array[]
e l'inizializzazione o assegnandolo qualche ricordo:
int array[] = {0,1,0}
int array[] = malloc(3*sizeof(int))
int array[] = calloc(3,sizeof(int))
A meno che non mi sbaglio, tutto quanto sopra è equivalente Java-C , destra?
Poi, oggi ho incontrato un codice in cui ho trovato il seguente:
pthread_t tid[MAX_OPS];
e alcune righe sotto, senza alcun tipo di inizializzazione ...
pthread_create(&tid[0],NULL,mou_usuari,(void *) 0);
Sorprendentemente (almeno a io), il codice funziona! Almeno in Java, ciò restituirebbe una bella "NullPointerException"!
Così, al fine di:
Sono corretto con tutte le "traduzioni" Java-C?
Perché funziona il codice?
C'è qualche differenza tra l'utilizzo di
malloc(n*sizeof(int))
ecalloc(n,sizeof(int))
?
Grazie in anticipo
Il primo paragrafo presenta affermazioni pericolosamente ambigue. L'OP non stava cercando di assegnare memoria a un array, stava tentando di assegnare un (void *), il ritorno da malloc() a un array e se quell'array era stato un int * Array [i], probabilmente in un per il ciclo {}, funzionerebbe bene, ed è la base per il modo in cui gli array dinamici e multidimensionali vengono allocati dall'heap. Inoltre, C99 supporta array di dimensioni variabili allocati fuori dallo stack, una funzione utilizzata da pochi programmatori C, la maggior parte preferendo alloca(), me incluso. http://stackoverflow.com/q/1018853/2548100 – user2548100
calloc() è praticamente solo memset (malloc (n * mysize), 0, (n * mysize)). Soprattutto perché C usa stringhe con terminazione null, calloc() è molto utile, specialmente quando si visualizzano le stringhe in un debugger, che in genere mostra la stringa solo fino al terminatore null. Se stai solo indicando C, usa calloc al posto di malloc, ti farà risparmiare molti errori di stringa C non terminati che potrebbero causare il crash del tuo programma. Per codice di produzione/rilascio, utilizzare calloc() solo quando è effettivamente necessario inizializzare il buffer/array/vettore su (_int8) 0. – user2548100
Solo per concludere e per completezza, una matrice è un puntatore. In effetti, qualsiasi nome di matrice in C è esattamente, precisamente un puntatore alla base del primo byte del primo oggetto nell'array e niente di più. Per le persone che provengono da Java,.Net, ecc., È utile sapere che C mantiene il tipo di oggetti/variabili completamente separati dalla memoria allocata per tenerli. Questo è il motivo per cui puoi lanciare un puntatore come int, creare UNION, ecc. Molto, molto flessibile, ma pericoloso per i noobies. Quando si assegna un array int, la sua giusta archiviazione in una posizione. Puoi mettere tutto ciò che ti piace in quel magazzino. – user2548100