PDA

Visualizza la versione completa : [C] Allocazione dinamica della memoria


pop killer
12-01-2006, 15:26
Ragazzi, volevo vedere come funzionava l'allocazione dinamica ed ho provato a fare questo semplice script:

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

int main()
{
int i, yn, elem, dimint, dimarr, *array;;
printf("Inserire il numero di elementi interi (intero):\n");
scanf("%i", elem);
dimint = sizeof(int);
dimarr = elem * dimint;
array = (int *)malloc(dimarr);
if(array == NULL)
{
printf("Memoria insufficente per allocare %i elementi", elem);
system("PAUSE");
}
printf("Vuoi inserire il loro valore uno alla volta (digita 1)\nOppure lasciare assegnare il valore al programma? (digita 2)\n");
scanf("%i", yn);
if(yn == 1)
{
for(i = 0; i < elem; i++)
{
printf("Valore array[%i] (intero): ", i);
scanf("%i", array[i]);
printf("\n");
}
}
else
{
for(i = 0; i < elem; i++)
{
array[i] = i;
}
}
for(i = 0; i < elem; i++)
{
printf("array[%i] = %i\n", i, array[i]);
}
printf("Allocati per l'array personalizzato: %i byte\n", dimarr);
system("PAUSE");
return 0;
}

La compilazione va a meraviglia, ma quando avvio il programma ad un certo punto si blocca a causa di un "errore di segmentazione", da cosa e' dovuto?

unomichisiada
12-01-2006, 16:06
-La scanf richiede l'indirizzo della variabile
-Quando allochi una arry di interi devi moltiplicare la dim dell'array per la dimensione in byte di un intero


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

int main()
{
int i, yn, elem, dimint, dimarr, *array;;
printf("Inserire il numero di elementi interi (intero):\n");
scanf("%i", &elem);
dimint = sizeof(int);
dimarr = elem * dimint;
array = (int *)malloc(dimarr* sizeof(int));
if(array == NULL)
{
printf("Memoria insufficente per allocare %i elementi", elem);
system("PAUSE");
}
printf("Vuoi inserire il loro valore uno alla volta (digita 1)\nOppure lasciare assegnare il valore al programma? (digita 2)\n");
scanf("%i", &yn);
if(yn == 1)
{
for(i = 0; i < elem; i++)
{
printf("Valore array[%i] (intero): ", i);
scanf("%i", &array[i]);
printf("\n");
}
}
else
{
for(i = 0; i < elem; i++)
{
array[i] = i;
}
}
for(i = 0; i < elem; i++)
{
printf("array[%i] = %i\n", i, array[i]);
}
printf("Allocati per l'array personalizzato: %i byte\n", dimarr);
system("PAUSE");
return 0;
}

pop killer
12-01-2006, 16:12
Originariamente inviato da unomichisiada
-La scanf richiede l'indirizzo della variabile
-Quando allochi una arry di interi devi moltiplicare la dim dell'array per la dimensione in byte di un intero


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

int main()
{
int i, yn, elem, dimint, dimarr, *array;;
printf("Inserire il numero di elementi interi (intero):\n");
scanf("%i", &elem);
dimint = sizeof(int);
dimarr = elem * dimint;
array = (int *)malloc(dimarr* sizeof(int));
if(array == NULL)
{
printf("Memoria insufficente per allocare %i elementi", elem);
system("PAUSE");
}
printf("Vuoi inserire il loro valore uno alla volta (digita 1)\nOppure lasciare assegnare il valore al programma? (digita 2)\n");
scanf("%i", &yn);
if(yn == 1)
{
for(i = 0; i < elem; i++)
{
printf("Valore array[%i] (intero): ", i);
scanf("%i", &array[i]);
printf("\n");
}
}
else
{
for(i = 0; i < elem; i++)
{
array[i] = i;
}
}
for(i = 0; i < elem; i++)
{
printf("array[%i] = %i\n", i, array[i]);
}
printf("Allocati per l'array personalizzato: %i byte\n", dimarr);
system("PAUSE");
return 0;
}



Grazie, il problema e' solo la &, se ci fai caso non c'e' bisogno di moltiplicare, l'ho fatto prima.
Una domanda, con l'allocazione dinamica posso cambiare il nome di una variabile?

unomichisiada
12-01-2006, 16:20
Originariamente inviato da pop killer
Grazie, il problema e' solo la &, se ci fai caso non c'e' bisogno di moltiplicare, l'ho fatto prima.
Una domanda, con l'allocazione dinamica posso cambiare il nome di una variabile?
Hai ragione mi è sfuggito perchè io faccio sempre nell'altro modo.In che senso? Se ho capito bene la risposta e no cmq.

pop killer
12-01-2006, 17:05
Ragazi, e per un array di stringhe da input? come posso fare?

unomichisiada
12-01-2006, 17:16
Originariamente inviato da pop killer
Ragazi, e per un array di stringhe da input? come posso fare?
Cioè acquisire un array di stringhe in una solo botta da tastiera? Potresti far inserire all'utente una stringa unica con le stringhe che ti interessano separate da uno spazio,recuperare la stringa con gets in un buffer molto grande e poi parsare il buffer con sscanf (la doppia s non è casuale)

pop killer
12-01-2006, 17:21
Originariamente inviato da unomichisiada
Cioè acquisire un array di stringhe in una solo botta da tastiera? Potresti far inserire all'utente una stringa unica con le stringhe che ti interessano separate da uno spazio,recuperare la stringa con gets in un buffer molto grande e poi parsare il buffer con sscanf (la doppia s non è casuale)
In parole terrene? Potresti farmi vedere uno script? Non si puo' fare come ho fatto prima ma togliendo gli interi e mettendo i char?

unomichisiada
12-01-2006, 17:48
Originariamente inviato da pop killer
In parole terrene? Potresti farmi vedere uno script? Non si puo' fare come ho fatto prima ma togliendo gli interi e mettendo i char?
Ma non ho capito,una sola stringa o un array di stringhe?
Per una sola stringa:


char stringa[80];
scanf("%s", stringa);

Nota che con le stinghe non ci vuole la &

pop killer
12-01-2006, 18:40
Originariamente inviato da unomichisiada
Ma non ho capito,una sola stringa o un array di stringhe?
Per una sola stringa:


char stringa[80];
scanf("%s", stringa);

Nota che con le stinghe non ci vuole la &
No no no credo che non ci siamo capiti, in sostanza vorrei fare questa cosa:

Chiede un numero;
crea un array con capienza il numero dato prima
chiede numero stringhe, una alla volta
salva le stringhe su array[0], array[1], e via di scorrendo, e le stampa.

In sostanza ci vorrebbe un array multiplo, oppure qualcos'altro... consigli?

unomichisiada
12-01-2006, 19:29
Originariamente inviato da pop killer
No no no credo che non ci siamo capiti, in sostanza vorrei fare questa cosa:

Chiede un numero;
crea un array con capienza il numero dato prima
chiede numero stringhe, una alla volta
salva le stringhe su array[0], array[1], e via di scorrendo, e le stampa.

In sostanza ci vorrebbe un array multiplo, oppure qualcos'altro... consigli?
Ok questo volevo capire.Allora dovè il problema? Devi solo fare una scanf per chiedere il numero di stringhe, allocare un array di stringhe dinamicamente e poi fare un ciclo for da zero al numero che hai acquisito prima in cui in ogni iterazione fai una scanf del tipo scanf("%s",array[i]);Tutto chiaro?O no? se no sii più specifico, non sai fare l'allocazione dinamica dell'array di stringhe o cosa? :ciauz:

Loading