PDA

Visualizza la versione completa : Dubbio con realloc linguaggio c


Giulian2
27-02-2010, 22:44
alve non ho capito bene una cosa.
Usando realloc in questo modo (cioè per diminuire lo spazio allocato
precedentemente con malloc) i dati che avevo salvato nel vettore
restano disponibili ??
E' corretto usare realloc per conservare una parte del vettore e
liberare l' altra ?.
in questo caso non funziona perchè ??

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

int main() {
int *values = NULL ;
int capacity;
int i = 0;

printf("Inserisci il numero di elementi da creare... ");
scanf("%d",&capacity);

values= (int *)malloc(capacity*sizeof(int));
if(values == NULL){
printf("Memoria non disponibile....");
}

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

printf("Inserisci il %d^ elemento : ",i+1);

scanf("%d",&values[i]);
}

printf("Digitare il numero di elementi da mantenere : ");
int nn;
scanf("%d",&nn);

values = (int*)realloc(values,(nn)*sizeof(int));

if(values== NULL){
printf("Memoria non disponibile....");
}
getchar();
getchar();
return 1
}

oregon
27-02-2010, 23:13
Originariamente inviato da Giulian2
in questo caso non funziona perchè ??

Cioè? Perchè dici che non funziona?

Giulian2
27-02-2010, 23:29
Ciao grazie per l' attenzione io volevo fare semplicemnte questo esercizio :

Scrivere un programma che dato un vettore di dimensione specificata dall' utente e formato da elementi inseriti dal medesimo utente, si chiede di ridemensionare la sua dimensione ai primi "n" elementi (specificati dall' utente).

Ex se v={7,9,11,12} e si voglio mantenere solo i primi n=3, allora v diventa v={7,9,11}
riducendo la memoria utilizzata.

Nel caso del programma che ho fatto io usando realloc in quel modo (cioè riduco lo spazio allocato per il vettore di int) libero veramente parte della memoria allocata per il vettore??
e se si cosa succede hai dati che prima erano allocati nel vettore e dopo non lo sono più ??

oregon
27-02-2010, 23:37
Originariamente inviato da Giulian2
Nel caso del programma che ho fatto io usando realloc in quel modo (cioè riduco lo spazio allocato per il vettore di int) libero veramente parte della memoria allocata per il vettore??

Sì ... ok ...



e se si cosa succede ai dati che prima erano allocati nel vettore e dopo non lo sono più ??

Nulla ... sono sempre in memoria, ma dato che quello spazio non è allocato per il vettore, non sono presi in considerazione ...

Ma non hai detto perchè dici che non funziona ...

Giulian2
28-02-2010, 00:09
Grazie ora ho capito !!
Dicevo che non funzionava perchè dopo aver usaro realloc e quindi aver ridotto la dimensione del vettore, se provavo a stampare il contenuto del vettore, facendo in modo che vennissero stampati anche i dati che non erano più allocati in memoria, essi veniva stampati come se il vettore non fosse stato modificato.
Facevo il tutto con un ciclo for che scorresse il vettore di int.
Credo che questo dipenda dal fatto che il realloc dealloca la memoria ma non la sovrascrive, nel caso quindi se cerco di accedere ai vecchi dati del vettore (dove è stato deallocato) sono sempre accedibili, non essendo però parte della memoria allocata.

Forse non sono stato molto chiaro....scusa l' ora....se vuoi posso provare a chiarimi meglio.

oregon
28-02-2010, 00:15
Originariamente inviato da Giulian2
Credo che questo dipenda dal fatto che il realloc dealloca la memoria ma non la sovrascrive

Esatto ...


nel caso quindi se cerco di accedere ai vecchi dati del vettore (dove è stato deallocato) sono sempre accedibili, non essendo però parte della memoria allocata.

Quasi ... i dati "potrebbero" essere ancora accedibili (e normalmente è così) ... oppure, potresti trovare valori completamente diversi (perchè la memoria è stata riservata ad altri scopi ed utilizzata in altro modo), oppure ancora, potresti avere un errore perchè, per vari motivi, lo spazio degli indirizzi non appartiene piu' al processo ...

Giulian2
28-02-2010, 00:41
Grazie tante !!! :) :)

Loading