Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - malloc e l'allocazione dinamica della mamemoria
Forum - C/C++ - malloc e l'allocazione dinamica della mamemoria

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 21:29
Giovedì, 22/07/2010
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
Codice sorgente - presumibilmente C/C++

  1. 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:

Codice sorgente - presumibilmente C++

  1. #include  <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main (void) {
  5.         int i;
  6.         int *p = malloc(8);
  7.         for (i = 0; i < 8; i++) {
  8.                 *(p + i) = rand();
  9.         }
  10.         for (i = 0; i < 8; i++) {
  11.                 printf("*(p + %d) = %d\n", i, *(p + i));
  12.         }
  13.         return 0;
  14. }



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 ?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:41
Giovedì, 22/07/2010
Testo quotato

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.

Testo quotato

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à.
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 21:44
Giovedì, 22/07/2010

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

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 21:54
Giovedì, 22/07/2010
scusate ma non ho capito :hail:

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:55
Giovedì, 22/07/2010
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à.
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 21:59
Giovedì, 22/07/2010
Codice sorgente - presumibilmente C/C++

  1. int *p = malloc(8);

a che serve quell'otto allora ?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:02
Giovedì, 22/07/2010
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à.
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 22:04
Giovedì, 22/07/2010
Testo quotato

Postato originariamente da Pitagora:

Codice sorgente - presumibilmente C/C++

  1. int *p = malloc(8);

a che serve quell'otto allora ?  



8 byte = 2 * sizeof(int)

su ia-32 intendo :)

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:10
Giovedì, 22/07/2010
L' "8" da la dimensione di memoria allocata dinamicamente, accessibili tramite il puntatore p.

Ti consiglio caldamente di utilizzare la funzione sizeof per calcolare quanta memoria occorre; in questo modo:

Codice sorgente - presumibilmente C/C++

  1. ...
  2.  int *p;
  3.  p=malloc(2 * sizeof(int));
  4.  ...



Ricorda che il c non controlla le operazioni sui puntatori, quindi, apparentemente, è possibile accedere e modificare tutta la memoria disponibile.

Ultima modifica effettuata da Poggi Marco il 22/07/2010 alle 22:17
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo