Ho una strana situazione. Sto cercando di implementare un dispositivo SDK da 10+ anni per il mio dispositivo di gestione della fotocamera. Il produttore non è più in affari e non ho alcuna possibilità di ottenere un aiuto ufficiale. Quindi eccomi qui, in cerca di aiuto per il mio brutto problema.Comportamento diverso della memoria non allocata tra le versioni di Visual Studio
L'SDK viene fornito con campioni Visual Studio 6.0
. Uno dei file include ha una struttura che termina con un array di un byte come sotto;
typedef struct AVData {
...
BYTE audioVideoData[1];
}AVDATA, *PAVDATA;
Ma questo singolo byte allocato array di byte riceve fotogrammi video e strano abbastanza, funziona benissimo con Visual Studio versione 6.0. Se provo con Visual Studio 2005/2008/2010, comincio a ricevere i messaggi di errore Memory Access Violation
che actully ha senso dal momento che non dovrebbe essere possibile allocare lo spazio a una matrice di dimensioni fisse in seguito, no? Ma lo stesso codice funziona bene con VS 6.0 ?! Probabilmente è causato da differenze di runtime del compilatore o del C++, ma non sono molto esperto su questo argomento, quindi è difficile dire la ragione certa per me.
Ho provato a cambiare la dimensione in un numero massimo previsto di byte come di seguito;
typedef struct AVData {
...
BYTE audioVideoData[20000];
}AVDATA, *PAVDATA;
Questo lo ha aiutato ottenere lavoro, ma di tanto in tanto ottengo problemi di violazione di accesso di memoria quando si cerca di distruggere l'oggetto decoder della biblioteca.
C'è qualcosa di decisamente sbagliato in questo. Non ho i codici sorgente dell'SDK, solo i file DLL, Lib e Header. Le mie domande sono:
1) È davvero legale allocare spazio a una matrice di dimensioni fisse nella versione di Visual Studio 6.0?
2) Esiste un modo possibile (un'opzione di compilazione, ecc.) Per far funzionare lo stesso codice con le versioni VS/C++ più recenti?
3) Poiché la soluzione alternativa per la modifica del file di intestazione funziona fino a un certo punto ma presenta ancora problemi, conosci un modo migliore per risolvere questo problema?
Immagino che il problema dovrebbe essere altrove. La dimensione dell'array non dovrebbe essere un problema qui, non è intesa ad essere un limite superiore. – BlueWanderer
Si chiama un array flessibile: http://stackoverflow.com/questions/5478706/flexible-array-member-c99-inside-a-structure –
Ma perché otteniamo la violazione di accesso alla memoria allora? Se creo un nuovo oggetto da questa struttura, non sarebbe creato con la dimensione di 1 (+ resto degli elementi della struttura)? Quindi, come possiamo archiviare più di un byte nell'array audioVideoData in seguito? È possibile riallocare la memoria su una matrice di dimensioni fisse? Dal momento che funziona con la versione VS 6.0, potrebbe essere possibile prima, ma per quanto riguarda VS 2005+? –