Oppure

Loading
22/07/10 19:29
Pitagora
Partiamo dal presupposto che sto studiando la funzione malloc più calloc realoc free ...

malloc ha solo un parametro, cioè un numero intero senza segno che ha il compito di aggiungere bytes al nostro puntatore.

Se facessi in questo modo
int *p = malloc(8);
in teoria dovrei memorizzare solo due interi. Un intero corrisponde a 4 byte 4 * 2 = 8 byte. In teoria dovrebbe essere così ma nella pratica non lo è affatto:

#include  <stdio.h>
#include <stdlib.h>

int main (void) {
	int i;
	int *p = malloc(8);
	for (i = 0; i < 8; i++) {
		*(p + i) = rand();
	}
	for (i = 0; i < 8; i++) {
		printf("*(p + %d) = %d\n", i, *(p + i));
	}
	return 0;
}


In questo programma, vengono salvati 7 numeri interi del valore di 28 bytes all'inizio riga ne alloco solo 8 .... C'è qualche cosa che mi sfugge ?
aaa
22/07/10 19:41
nessuno
Postato originariamente da Pitagora:
malloc ha solo un parametro, cioè un numero intero senza segno che ha il compito di aggiungere bytes al nostro puntatore.


NON si aggiungono byte ai puntatori ...

Si "alloca" (riserva) un blocco di memoria. E l'indirizzo del primo byte del blocco viene assegnato al puntatore.

Se facessi in questo modo...

... ma nella pratica non lo è affatto:
...

C'è qualche cosa che mi sfugge ?


Sì ... ti sfugge che la malloc "riserva" della memoria per i tuoi dati (i due interi).
Ma NON impedisce affatto al tuo programma di scrivere dove vuole in memoria.
Quindi tu scrivi nell'area "allocata" con la malloc e nella memoria che segue (che non è riservata ai tuoi dati).

In questo modo sovrascrivi dati del programma in esecuzione danneggiandoli e creando il rischio di crash del programma.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
22/07/10 19:44
HeDo

ti sfugge che non ci sono i check sui boundaries degli array :)

ffinche non da errore a runtime fai quello che vuoi con i puntatori :D
aaa
22/07/10 19:54
Pitagora
scusate ma non ho capito :hail:
aaa
22/07/10 19:55
nessuno
Cosa non hai capito ...?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
22/07/10 19:59
Pitagora
int *p = malloc(8); 
a che serve quell'otto allora ?
aaa
22/07/10 20:02
nessuno
Serve ad indicare che 8 byte sono "riservati" al tuo programma.

Sono 8 byte di memoria su cui "puoi fare affidamento".

Il resto della memoria esiste ma tu "non dovresti" utilizzarla a tuo piacimento perché utilizzata in altro modo. Puoi sempre accedere a tutta la memoria ma, non essendo "riservata" tramite la malloc, stai "invadendo" il terreno di altri ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
22/07/10 20:04
HeDo
Postato originariamente da Pitagora:

int *p = malloc(8); 
a che serve quell'otto allora ?


8 byte = 2 * sizeof(int)

su ia-32 intendo :)
aaa