PDA

Visualizza la versione completa : [C]Chiarimento Malloc


deleted_129
14-03-2013, 22:56
Salve a tutti, ho creato questo codice :


#include <stdio.h>
#include <malloc.h>

int main(){
int vettore[]={3,6,4,5,1,2,3,5};
int *nuovo;
int k=0,j,n=0 ,i;
nuovo=(int*)malloc(sizeof(int));
for(i=0;i<8;i++){
n=0;
for(j=0;j<i;j++){
if(nuovo[j]==vettore[i]){
n++;
}
}
if(n==0){
nuovo[k]=vettore[i];
k++;
}
}
printf("Vettore iniziale:");
for(i=0;i<8;i++){
printf(" %d ",vettore[i]);
}
printf("\n\nVettore senza ripetizioni:");
for(i=0;i<k;i++){
printf(" %d ",nuovo[i]);
}
scanf("%d");
return 0;
}

la mia domanda è: la funziona malloc non dovrebbe allocarmi solo 1 posto? perchè riesce ad allocarmeli tutti e quindi a far funzionare correttamente il programma?
PS: altre domande, perchè se metto la funzione dentro il for allocando per ogni elemento un'altro spazio, il programma va in crash? cosa combino nella memoria?
Grazie a tutti per eventuali risposte.

oregon
14-03-2013, 23:45
La malloc "riserva" della memoria al tuo processo ma la memoria esiste comunque.

Se usi della memoria riservata al tuo processo, non avrai mai problemi. In caso contrario, "potresti" non avere (apparentemente) alcun problema nell'usare memoria non riservata ma

1) potresti "sporcare" il contenuto di variabili/array

2) accedere a zone di memoria vietate e avere un crash.

Solo nel secondo caso ti accorgeresti subito dell'errore ma in tutti gli altri casi potresti avere malfunzionamenti successivi (ovviamente in programmi più complessi) e non accorgertene subito.

deleted_129
15-03-2013, 00:18
Quindi in questo caso va anche bene? se invece l'utente decideva quanti elementi inserire era meglio usare variabile=(int*)malloc((n)*sizeof(int)) , dove n e' il numero di elementi ?

oregon
15-03-2013, 00:27
Originariamente inviato da darkhero
Quindi in questo caso va anche bene?

No ... non va affatto bene. Anche se funziona, non va bene.


se invece l'utente decideva quanti elementi inserire era meglio usare variabile=(int*)malloc((n)*sizeof(int)) , dove n e' il numero di elementi ?

E' sempre così.

deleted_129
15-03-2013, 00:58
in questo caso io potrei anche non sapere quante ripetizioni ci sono, quindi come dovrei fare per allocare ogni volta che devo inserire un elemento dentro l'array? visto che il malloc dentro il for non mi va....

oregon
15-03-2013, 01:04
La malloc alloca un nuovo spazio di memoria. Non puoi usarlo nella for.

Usa la realloc

http://www.cplusplus.com/reference/cstdlib/realloc/

deleted_129
15-03-2013, 01:35
#include <stdio.h>
#include <malloc.h>

int main(){
int vettore[]={3,6,4,5,1,2,3,5};
int *nuovo;
int k=0,j,n=0 ,i;
nuovo=(int*)malloc(1*sizeof(int));
int dim=1;
for(i=0;i<8;i++){
n=0;
for(j=0;j<i;j++){
if(nuovo[j]==vettore[i]){
n++;
}
}
if(n==0){
nuovo=(int*)realloc(nuovo,(dim+1)*sizeof(int));
dim++;
nuovo[k]=vettore[i];
k++;
}
}
printf("Vettore iniziale:");
for(i=0;i<8;i++){
printf(" %d ",vettore[i]);
}
printf("\n\nVettore senza ripetizioni:");
for(i=0;i<k;i++){
printf(" %d ",nuovo[i]);
}
scanf("%d");
return 0;
}

cosi' va bene?

Loading