Array di puntatori

di il
3 risposte

Array di puntatori

Salve a tutti. Sarò breve, questo è il codice
#include "stdafx.h"
#include <iostream>

using namespace std;


int main()
{
	int *arg[5];
	int i;

	for ( i = 0; i < 5; i++) {

		arg[i] = (int *)malloc(sizeof(int));
		*arg[i] = i;
	}

	system("PAUSE");
	return 0;
}
Volevo capire come funziona questo programma. Questo è quello che so:
-la prima variabile è una array di puntatori
- la funzione malloc restituisce un puntatore di un blocco di memoria di dimensione 4 byte.

Volevo chiedere 2 cose:
1- Perchè se escludo la riga in cui è presente la funzione malloc il programma si interrompe?(in visual studio compare una finestra con scritto "Eccezione generata in corrispondenza di 0x00831740 in ConsoleApplication1.exe: 0xC0000005: violazione di accesso durante la scrittura del percorso 0xCCCCCCCC.")
2- E' giusta questa affermazione? Stampando *arg stampo il contenuto presente all'indirizzo a cui sta puntando il puntatore mentre stampando arg stampo il contenuto del puntatore cioè l'indirizzo a cui punta il puntatore(in questo caso all'indirizzo del blocco di memoria allocato). Vi chiedo questo perchè provando a stampare i vari arg ottengo indirizzi casuali. Pensavo che fossero indirizzi spaziati di 4 byte l'uno dall'altro(come un array insomma) ma il loro spazio è variabile inoltre capita anche che gli indirizzi successivi siano piu piccoli dei precedenti ma anche viceversa.

Grazie per l'aiuto.

3 Risposte

  • Re: Array di puntatori

    Perchè se escludo la riga in cui è presente la funzione malloc il programma ...
    Perché il programma va a scrivere in una zona di memoria che non è di proprietà del processo e questo fatto viene individuato da alcuni meccanismi di CPU/OS (su cui è inutile soffermarsi) che riportano l'errore (access violation). Un processo non può leggere e scrivere dove vuole in memoria.
    E' giusta questa affermazione? Stampando ...
    Corretto ... gli indirizzi sono decisi dall'allocatore a seconda dello stato del sistema e possono sembrare casuali o strani ma non lo sono.
  • Re: Array di puntatori

    oregon ha scritto:


    Perchè se escludo la riga in cui è presente la funzione malloc il programma ...
    Perché il programma va a scrivere in una zona di memoria che non è di proprietà del processo e questo fatto viene individuato da alcuni meccanismi di CPU/OS (su cui è inutile soffermarsi) che riportano l'errore (access violation). Un processo non può leggere e scrivere dove vuole in memoria.
    In realtà questo è un caso "fortunato", in quanto il programma crasha e sai che hai commesso un errore con qualche puntatore.
    Se, sfortunatamente, arg contiene un indirizzo valido, allora andrai a sporcare della memoria che potrebbe essere "occupata" da altre variabili, andando a causare problemi imprevedibili e difficili da rilevare.
  • Re: Array di puntatori

    ezio1400 ha scritto:


    1- Perchè se escludo la riga in cui è presente la funzione malloc il programma si interrompe?
    In riferimento a questo punto, tieni bene presente che ogni volta che usi un puntatore stai usando una variabile come le altre, l'unica differenza, come ben sai, è che stai puntando ad un indirizzo(e quindi area) di memoria. Una buona pratica è inizializzarlo, così come si fa con tutte le variabili, ad esempio con un nullptr o NULL. Ogni volta che lo usi potresti controllare che il tuo puntatore è valido, ovvero punta ad un'area di memoria diversa dal valore null di inizializzazione. È chiaro che quando chiami la free dell'area di memoria è opportuno che il puntatore venga "resettato" facendolo puntare nuovamente ad un valore null, proprio come quando l'hai inizializzato. Capisco che a priva vista queste possono sembrare pratiche inutili, o meramente pragmatiche. Ad esempio può sembrare inutile fare il check ad ogni utilizzo del puntatore. Tuttavia questa pratica ti assicura di evitare problemi come accedere ad aree di memoria che non sono valide oppure che appartengono ad un'altra variabile.
Devi accedere o registrarti per scrivere nel forum
3 risposte