PDA

View Full Version : [C99]Teoria: Array a lunghezza variabile


tomminno
10-10-2007, 17:34
Discutendo con i colleghi del mancato supporto del C99 da parte di VS2005, mi è venuto il dubbio su questa funzionalità del C.
Come fa il compilatore a mettere un array variabile nello stack?
Altrimenti mi sfugge il concetto di stack dinamico come l'heap.

71104
10-10-2007, 18:52
intendi come fa a fare una cosa del genere?

void f(unsigned int n) {
int a[n];
// ...
}


non mi sembra ci voglia molto: solitamente lo stack è un'area di memoria che cresce verso indirizzi più bassi, quindi è sufficiente sottrarre allo stack pointer il valore di n moltiplicato per sizeof(int). naturalmente non è detto che sia sempre possibile allocare n locazioni; non so cosa accada se a quella funzione f viene passato un valore di n troppo grande.

tomminno
11-10-2007, 08:31
intendi come fa a fare una cosa del genere?

void f(unsigned int n) {
int a[n];
// ...
}


non mi sembra ci voglia molto: solitamente lo stack è un'area di memoria che cresce verso indirizzi più bassi, quindi è sufficiente sottrarre allo stack pointer il valore di n moltiplicato per sizeof(int). naturalmente non è detto che sia sempre possibile allocare n locazioni; non so cosa accada se a quella funzione f viene passato un valore di n troppo grande.

Sicuramente hai uno stack overflow che è ben più facile da ottenere rispetto ad un errore su una malloc.
Soprattutto lo vedo pericoloso nei micro in cui non hai l'heap e ti ritrovi con 4KB di RAM

71104
11-10-2007, 10:06
su una normale architettura dotata di protezione della memoria lo stack overflow son problemi del tuo processo; se nei test vedi che il tuo programma crasha a causa di un'istruzione come quella allora non ti resta che aumentare la dimensione dello stack. comunque son d'accordo che faccia piuttosto schifo e che non ci voglia niente a sostituirla con una malloc controllata da un if subito dopo.