ciao a tutti
ho questo codice che mi legge un testo qualsiasi da tastiera e conta per tutti i caratteri distinti quante occorrenze son presenti.



codice:
/**
 * Programma che legge dei caratteri da tastiera
 * e comunica per ciascun distinto carattere quanto volte è stato
 * inserito.
 */

#include <iostream>
#include <malloc.h>
using namespace std;


int main()
{
	 //puntatori all'ultimo elemento degli array di caratteri e di occorrenza dei caratteri
	 char *stringpointer = (char *) malloc (sizeof(char));
	 int *occurrencepointer = (int *) malloc (sizeof(int));

	 //puntatori al primo elemento degli array di caratteri e di occorrenza degli stessi caratteri
	 char *string = stringpointer;
	 int *occurrence = occurrencepointer;

	 char c;
	 int numcaratteri = 0;
	 bool yetDigited = false;

	 printf("Inserire stringa, INVIO per terminare\n");

	 while ((c = getc(stdin)) != 10)  //getc legge un carattere da tastiera. 10 = '\n'
	 {
	     yetDigited = false;

	     for (int i = 0; i < numcaratteri; i++)	//per tutti i caratteri distinti sinora inseriti
	     {
		if (*(string + i * sizeof(char)) == c)	//il carattere appena digitato è già stato inserito
		{
               		yetDigited = true;
               		int *index = occurrence + i * sizeof(int);
               		(*index)++; //incremento la sua occorrenza
               		break;
		}
	     } //end FOR
	     if (yetDigited)  //al prossimo carattere
		continue;

	     //è stato digitato un carattere nuovo
	     *stringpointer = c;	//inserisco il carattere nella sua cella di memoria
	     stringpointer = stringpointer + sizeof(char); //passo alla cella di memoria successiva
	     *occurrencepointer = 1; //nuovo carattere, occorrenza = 1
	     occurrencepointer = occurrencepointer + sizeof(int);  //passo alla cella di memoria successiva

	     numcaratteri++;	//un nuovo carattere è stato inserito
	     //aumento lo spazio a disposizione per un eventuale futuro carattere
	     string = (char *) realloc (string, (numcaratteri+1) * sizeof(char));
	     occurrence = (int *) realloc (occurrence, (numcaratteri+1) * sizeof(int));
	     if ((string == 0) | (occurrence == 0))
	     {
	      	 printf("Memoria non disponibile");
			 return 1;
	     }
	  }  //end WHILE


	  printf ("\nStringa inserita: %s\n", string);

	  for (int i =0; i < numcaratteri; i ++)
	  {
		  char *indexcharacter = string + i* sizeof(char);
		  int *indexoccurrence = occurrence + i* sizeof(int);
		  cout << *indexcharacter << " " << *indexoccurrence << "\n";
	  }
	  return 0;
}
il programma sostanzialmente funziona, ma ho due domande, la prima delle quale credo possiate rispondere senza nemmeno guardare troppo il codice
1 - perchè prima devo inserire il testo e poi mi esegue la printf che si trova prima del while principale scambiando l'ordine effettivo delle istruzioni?

2- a volte vaneggia inserendo un numero a caso nel conteggio. ad esempio parafrasando battiato se inserisco "vogliovedertidanzare" sul carattere i mi restituisce un contatore di 2054054260.
ecco l'output

codice:
vogliovedertidanzare
Inserire stringa, INVIO per terminare

Stringa inserita: vogliedrtanz
v 2
o 2
g 1
l 1
i 2054054260
e 3
d 2
r 2
t 1
a 2
n 1
z 1
grazie a chiunque vorrà aiutarmi, ciao!