Ciao a tutti, ho vari quesiti riguardo lo stesso esercizio, ringrazio in anticipo chi avesse la pazienza di aiutarmi
Il testo chiede di scrivere un programma che legga una sequenza di int (terminata da 0) e la stampi al contrario, allocando la memoria dinamicamente; non sapendo quanti int saranno inseriti devo ridimensionare il vettore che li contiene partendo da una dimensione piccola (es: 2) e raddoppiarla ogni volta che il vettore si riempie.
Io ho risolto con questo codice:
#include<stdio.h>
#include<stdlib.h>
int main (void){
int a[2], x=2, cont=0, *p, i;
p=a;
printf("Inserire una sequenza di interi terminata da 0: ");
do{
scanf("%d", &a[cont]); //inserisco l'int nel vettore predisposto
cont++;
if(cont==x){ //controllo se il vettore sia pieno
x *= 2;
p = (int *) malloc(x*sizeof(int));
}
}while(a[cont-1] != 0);
cont -= 2;
for(i=0; i<=cont; i++)
printf("%d ", a[cont-i]); // stampo al contrario il vettore
printf("\n");
free(p);
exit(0);
}
L'esecuzione mi sembra dia valori corretti, ma è la prima volta che mi cimento nell'allocazione dinamica in questo modo, e non vorrei che funzionasse tutto per qualche strana coincidenza fortunata .
I miei dubbi sono:
1) il codice (soprattutto nei dintorni della malloc) ha senso?
2) la "free(p);" è necessaria per un banale esercizietto come questo o serve solo per programmi "veri"?
3) perché senza la "exit(0)" il programma (capita solo con sequenze di 5 o più interi) stampa sia la sequenza rovesciata che il "\n", ma prima di terminare mi dà "Segmentation fault (core dumped)"?
4) ho provato ad adattare questo stesso programma a sequenze di char (ho cambiato solo i tipi e la condizione del while, che sia diverso da "\n") ma funziona bene solo con sequenze di massimo 5 caratteri. (con 6 ho bisogno di terminare 2 volte la sequenza (premendo 2 volte return) ma poi funziona, con 7 o più invece stampa la sequenza fino al posto del settimo inserito escluso (quindi settultimo ( ) da stampare), poi una serie di simboli misteriosi come pescati a caso dalla RAM, poi l'ultimo char e il resto della sequenza giusta. Faccio un esempio per chiarezza:
Input = abcdefghijklmno
Output = o n m l k j i h (serie di simboli strambi) o f e d c b a
Tutto questo sia con che senza la "exit(0)". Perché?
Sospetto fortemente che i quesiti 3 e 4 siano fortemente collegati dallo stesso errore, ma non ho idea di cosa sia.
Ho provato a stampare sia la "strlen" dei vari input, che il "cont" alla fine dell'inserimento, ed effettivamente anche loro testimoniano ci sia qualcosa di strano.. vi risparmio i risultati, se invece pensate che possano servire ve li scriverò.