@trash... stai facendo un 'pappocchione' di concetti incompatibili tra di loro, senza nessun senso.
E' evidente che mancano le basi per ENTRAMBI I linguaggi.
Quindi mettiamola in un'altro modo: C# NON POSSIEDE il concetto di puntatore/indirizzo di memoria. Questo NON VUOL DIRE che non sappia cosa sia, ma cge NON E' UN CONCETTO ACCESSIBILE all'utente.
In C# c'e' il concetto di 'reference' che a tutti gli effetti e' un indirizzo di memoria, MA che l'utente NON PUO' MANIPOLARE IN NESSUN MODO: non si puo' sapere quanto vale, non si puo' stampare, non di puo' convertire, non di puo' assegnare. NON CI SI PUO' FARE NULLA.
Poi c'e' tutta la questione della DIMENSIONE in byte di un dato: anche qui I due linguaggi differiscono in molti aspetti rendendoli FONDAMENTALMENTE INCOMPATIBILI a dispetto di una sintassi somigliante. E' un po' come un'automobile a benzina e diesel: NON PUOI riempire il serbatoio con la prima cosa che ti capita!
Poi ci sono tecniche decisamente avanzate che permettono di far convivere puntatori C con C#, MA richiedono tutta una serie di accorgimenti abbastanza incasinati SIA a livello di scrittura del codice SIA a livello di direttive del compilatore. Ma chi kevusa, SA ESATTAMENTE che cosa sta facendo.
TUTTO il codice postato, NON HA SENSO, anche escludendo le parti evidentemente non implementate.
Tu dirai: ok, allora spiegami gli errori.
I'll problema sta' proprio qui! Per spiegarti gli errori e la soluzione serve un background che richiede diversi mesi di studio!
Tu dirai: esagerato.
La risposta e': prenditi un libro per linguaggio e studiati la dimensione dei tipi primitivi e degli array/vettori di tipi primitivi e scrivi quanti byte sono richiesti per:
C/C++: char, char[10], char*, wchar_t, wchar_t[10] wchar_t*
C#: char, char[10], string