In C standard, hai alcune opzioni per dichiarare una funzione che accetta un puntatore a un blocco di dati:
void style_1(int * arr);
void style_2(int arr[]);
void style_3(int arr[10]);
void style_4(int size, int arr[size]);
void style_5(int arr[static 10]);
void style_6(int size, int arr[static size]);
La cosa è, per quanto posso dire, che la maggior parte della "scelta" è sintattica e non contribuisce molto al reale significato del programma. I primi tre stili sembrano essere esattamente equivalenti, perché "Una dichiarazione di un parametro come 'array di tipo ' deve essere adattata a 'puntatore qualificato a tipo '" (C11 6.7.6.3 p7) e style_4
è uguale per gli scopi del parametro pointer. Sia per style_3
che style_4
, la dimensione dell'array viene eliminata.
style_5
e style_6
sono in realtà diversi e impongono un vincolo utile, garantendo un puntatore non nullo con una quantità minima di memoria. Ma perché abbiamo bisogno di aggiungere una parola chiave per fare questo? Le dichiarazioni di style_3
e style_4
sembrano comunicare altrettante informazioni al lettore. Un compilatore sicuramente non avrebbe problemi con quelli, se solo il linguaggio consentisse loro di essere significativi? Così com'è, questa scelta progettuale sembra introdurre un buco che può permettere di superare errori extra, istruendo efficacemente la macchina non per controllarli per impostazione predefinita.
Perché è stato aggiunto static
per imporre il vincolo della dimensione sui parametri dell'array in C? Perché la dimensione non è sufficiente?