È meglio minimizzare l'uso dei puntatori in C?

4

Penso che molte persone siano d'accordo sul fatto che i puntatori sono una fonte importante di bug nei programmi C (se non la più grande fonte di bug). Altre lingue puntano completamente a questo scopo. Quindi, quando si lavora in C, sarebbe meglio evitare di usare i puntatori ogni volta che è praticabile? Ad esempio, di recente ho scritto una funzione come questa:

void split (char *record, char *delim,
            int numfields, int fieldmax,
            char result[numfields][fieldmax]);

Pur non essendo versatile come una variabile allocata dinamicamente, in quanto richiede al programmatore di conoscere il numero di campi in anticipo e qualsiasi cosa oltre il fieldmax viene troncata (che a volte è accettabile), elimina la necessità di gestione della memoria, e il potenziale per la corruzione della memoria. Penso che questo sia un buon trade, ma mi chiedevo quali fossero le opinioni degli altri programmatori su questo.

    
posta treadmarks 02.11.2011 - 15:30
fonte

6 risposte

23

Gli altri linguaggi non "interrompono completamente i puntatori", limitano solo ciò che puoi fare con loro, danno loro una sintassi che assomiglia a variabili non puntatore, gestiscono alcune operazioni su di essi dietro le quinte e li chiamano qualcos'altro , come un riferimento o un oggetto. Se dovessi fare una distinzione tra l'assegnazione di una copia di qualcosa o no, hai a che fare con i puntatori.

Ad eccezione dei paradigmi di programmazione che passano tutto per copia, con evidenti implicazioni sul rendimento, l'uso di puntatori è inevitabile in tutti i programmi tranne che in quello più semplice. Con tutti i mezzi, usa le variabili di stack dove ha senso, ma se cerchi di evitare troppo i puntatori, introduci una serie di potenziali bug completamente diversi.

    
risposta data 02.11.2011 - 16:32
fonte
38

Secondo me, non ha senso usare C e volere evitare i puntatori. Se lo fai, allora è meglio usare un'altra lingua.

I puntatori sono inevitabili in C. Questo è ciò che rende C così potente e anche ciò che rende C un dolore nel culo qualche volta. C è pensato per essere usato con i puntatori.

Gli array sono puntatori, le funzioni sono puntatori, l'allocazione della memoria funziona tramite i puntatori e così via. Approfitta di questo o cambia lingua.

    
risposta data 02.11.2011 - 15:36
fonte
1

Quelle char* dovrebbero essere in realtà const , a meno che tu non intenda realmente un puntatore a un singolo carattere, che trovo piuttosto improbabile. A parte questo, i puntatori sono la ragione per cui C è così veloce - sono estremamente efficienti. Che altro hai intenzione di fare, copiare tutto intorno ovunque? La possibilità di aliasare qualsiasi variabile in qualsiasi momento è rischiosa, ma è anche molto potente.

Se non ti piacciono i bug e ti piace ancora le prestazioni, esegui l'aggiornamento a C ++. È molto meno buggato quando scritto con aderenza ai suoi principi più elementari e può essere più veloce di C, e non è certamente più lento nel caso generale.

    
risposta data 02.11.2011 - 15:34
fonte
0

Buona fortuna con il runtime standard o qualsiasi libreria di terze parti. Se vuoi dire che vuoi evitare il puntatore manipolazione allora potresti avere una possibilità, ma non credo che otterrai alcun beneficio reale. È la natura della bestia; se vuoi protezione dagli errori del puntatore, allora starai meglio usando una lingua diversa.

    
risposta data 02.11.2011 - 17:01
fonte
0

La potenza di C deriva dal fatto che l'archiviazione dei dati sottolineata è trasparente a uso. Non si tratta di puntatori, si tratta piuttosto di lavorare direttamente sull'hardware pur essendo un codice di uso generale.

Anche se in molti casi questo può non essere di alcuna virtù, in questo caso non è necessario rilasciare i puntatori da C , è necessario rilasciare C dallo sviluppo .

Secondo me, nella tua versione precedente, sei NON che evita i puntatori. Posso sempre fornire un puntatore già corrotto (o libero () ed) come * record e tutto sarà condannato!

Il problema principale, però, non è davvero un suggerimento! Ho visto così tanta gente che all'inizio non lo capisco, ma anche dopo aver avuto un ragionevole numero di esperienze di progetto, alcuni lo capiscono, altri lo temono. Non posso dire con autorevolezza, ma quelli che hanno una certa esposizione di base (introduzione) all'architettura del microprocessore e / o alle basi del sistema operativo, non affrontano proprio questo problema. È l'essenza di come funzionano le macchine e C lo traduce in modo molto trasparente a livello superiore. Se hai mai timore dei puntatori in C, prova a lavorare su questa conoscenza di base e molta pratica; le cose dovrebbero andare bene. Non credo che si debba mai temere C o i suoi 'puntatori . Se hai paura, c'è sempre un modo per superarlo e poi iniziare a divertirti con i puntatori in C.

    
risposta data 02.11.2011 - 17:34
fonte
0

In linea di principio hai ragione che usare solo i puntatori quando necessario comporterà un minor numero di bug. Tuttavia, in C, quasi sempre, sono necessari i puntatori.

Ad esempio, potrei sbagliarmi, ma non penso che il tuo esempio di codice funzioni: non penso che la funzione possa ricevere una matrice dinamica come argomento, quindi dovrà usare "numfields" e "fieldmax" "per calcolare dove scrivere i dati - che saranno scarabocchiati sulla memoria casuale se vengono superate le dimensioni sbagliate.

E la maggior parte delle volte, decidere in anticipo le dimensioni del reso sarà difficile. Se vuoi evitare i bug del puntatore, usa C ++ e usa i puntatori solo quando è necessario.

    
risposta data 16.01.2012 - 13:12
fonte

Leggi altre domande sui tag