[C] allocazione dinamica di un array

cicchi27
Salve, ho delle perplessità riguardo l'allocazione di un array dinamico. Praticamente ho scritto questo codice per esercizio giusto per capire la funziona calloc:
dovrei stampare prima dei numeri in un array di grandezza 10 e,successivamente, raddoppiarne la dimensione e stampare i quadrati dei vari elementi. Il problema è che scritto così sembra non funzionare la realloc per come mi hanno fatto capire i vari testi che ho letto.
Ora, prima di considerare questo programma in particolare, vorrei capire in generale come usare correttamente
queste funzioni.

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

typedef struct arrayDinamico {
	int *ptr;
	int size;
} ArrayDinamico;

void printArray(ArrayDinamico array){
	
	for(int i = 0; i <= array.size -1; i++){
		
		printf("%d", array.ptr[i]);
		
		puts("");
	}
}

int main()
{
	ArrayDinamico a;
	a.ptr = malloc(10*sizeof(int));
	a.size = 10;
	
	for( int i = 0; i <= 9; i++)
        a.ptr[i] = i;
	
	
	
	printArray(a);
	
	puts("");
	
	a.ptr = realloc(a.ptr, 20*sizeof(int));
	
	
	for( int i = 0; i <= 19; i++)
        a.ptr[i] = i*i;
	
	printArray(a);
	
	
	
}

Risposte
Super Squirrel
Ciao, un paio di osservazioni:
- è sempre buona norma verificare che l'allocazione sia andata a buon fine controllando che malloc/calloc/realloc ritornano un puntatore non nullo;
- invece di scrivere
i <= array.size -1

non sarebbe più semplice e chiaro scrivere
i < array.size


Veniamo ora al "problema" che hai riscontrato. Non mi sembra che aggiorni il membro size di a prima di richiamare per la seconda volta la funzione printArray()! :D

cicchi27
Allora per quanto riguarda la verifica che la malloc è andata a buon fine effettivamente ho dimenticato di inserirla. Quindi dovrei aggiornare io la dimensione dell'array dopo il realloc? Avevo pensato ingenuamente che la stessa funzione lo faceva automaticamente :?

cicchi27
Un'altra cosa, c'è qualche strumento che può controllare come viene gestita la memoria di un programma? Per esempio quando non libero la memoria dopo l'allocazione. Uso Windows 10

Marco Beta2
"Cicchi27":
Un'altra cosa, c'è qualche strumento che può controllare come viene gestita la memoria di un programma? Per esempio quando non libero la memoria dopo l'allocazione. Uso Windows 10


In C no, in JAVA si, ovvero il garbage collector... in C devi provvedere tu con la free che nel tuo caso sarà free(a), dove va messa lo decidi tu in base alla logica del programma... Ci tengo a dirti di usarla sempre la free perchè se dovessi sviluppare un programmino didattico con dei processi daemon (o peggio ancora a lavoro ma il C non è piu usato come un tempo) rischi di far piantare tutto :-D Quindi a livello didattico non è tassativo ma è buona norma, a livello lavorativo è la prima cosa che devi fare :-D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.