É melhor minimizar o uso de ponteiros em C?

4

Acho que a maioria das pessoas concorda que os ponteiros são uma grande fonte de erros nos programas em C (se não a maior fonte de bugs). Outros idiomas descartam ponteiros inteiramente por esse motivo. Ao trabalhar em C, então, seria melhor evitar o uso de ponteiros sempre que possível? Por exemplo, escrevi recentemente uma função como esta:

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

Embora não seja tão versátil quanto uma variável alocada dinamicamente, na medida em que requer que o programador saiba o número de campos antecipadamente e qualquer coisa acima de fieldmax seja truncada (o que às vezes é aceitável), elimina a necessidade de gerenciamento de memória, e o potencial de corrupção de memória. Eu acho que este é um bom negócio, mas eu queria saber quais eram as opiniões de outros programadores sobre isso.

    
por treadmarks 02.11.2011 / 15:30
fonte

6 respostas

23

Outras linguagens não "soltam ponteiros completamente", elas apenas restringem o que você pode fazer com elas, dão a elas uma sintaxe que se parece com variáveis que não são de ponteiro, manipulam algumas operações nos bastidores e as chamam de outra coisa , como uma referência ou objeto. Se você tiver que fazer uma distinção entre atribuir uma cópia de algo ou não, você está lidando com ponteiros.

Com exceção dos paradigmas de programação que passam tudo por cópia, com óbvias implicações de desempenho, o uso de ponteiros é inevitável em todos, menos no mais simples dos programas. Por todos os meios, use variáveis de pilha onde faz sentido, mas se você tentar evitar ponteiros muito, você introduzirá uma raça completamente diferente de possíveis bugs.

    
por 02.11.2011 / 16:32
fonte
38

Na minha opinião, não faz sentido usar C e querer evitar ponteiros. Se você fizer isso, é melhor usar outro idioma.

Ponteiros são inevitáveis em C. Isto é o que faz C tão poderoso e também o que faz C uma dor no burro em algum momento. C é para ser usado com ponteiros.

Matrizes são ponteiros, funções são ponteiros, trabalho de alocação de memória através de ponteiros e assim por diante. Tire proveito disso ou mude de idioma.

    
por 02.11.2011 / 15:36
fonte
1

Esses char* devem ser realmente const , a menos que você tenha realmente indicado um ponteiro para um único caractere, o que acho bastante improvável. Além disso, os ponteiros são a razão pela qual o C é tão rápido - eles são extremamente eficientes. O que mais você vai fazer, copiar tudo em todos os lugares? A capacidade de codificar qualquer variável a qualquer momento é arriscada, mas também é muito poderosa.

Se você não gosta de bugs e ainda gosta de desempenho, faça upgrade para o C ++. É muito menos problemático quando escrito com base em seus princípios mais básicos e pode ser mais rápido que C, e certamente não é mais lento no caso geral.

    
por 02.11.2011 / 15:34
fonte
0

Boa sorte ao usar o tempo de execução padrão ou qualquer biblioteca de terceiros. Se você quer dizer que quer evitar a manipulação de ponteiros, então você pode ter uma chance, mas eu não acho que você obterá algum benefício real. É a natureza da besta; Se você quer proteção contra erros de ponteiro, então seria melhor usar um idioma diferente.

    
por 02.11.2011 / 17:01
fonte
0

O poder de C vem do fato de que o armazenamento de dados é transparente para usar. Não se trata realmente de ponteiros, trata-se mais de trabalhar diretamente em hardware enquanto ainda é um código de propósito geral.

Embora isso possa não ser uma virtude em muitos casos, nesse caso, não precisamos eliminar os ponteiros de C , precisamos descartar C do desenvolvimento .

Na minha opinião, na sua versão anterior, você está NÃO evitando ponteiros. Eu sempre posso fornecer um ponteiro já corrupto (ou livre () ed) como registro e tudo estará condenado!

A questão central, no entanto, não é de fato ponteiros! Eu tenho visto muitas pessoas não acertarem no começo, mas mesmo depois de ter um número razoável de experiência em projetos, alguns entendem, alguns temem. Eu não posso dizer com autoridade, mas aqueles que têm alguma exposição básica (introdução) à arquitetura do microprocessador e / ou noções básicas do sistema operacional, não enfrentam muito problema. É a essência de como as máquinas funcionam e C traduz de forma muito transparente em nível superior. Se você tem medo ponteiros em C, tente trabalhar com esse conhecimento básico e muita prática; as coisas devem funcionar bem. Eu não acredito que alguém deva temer C ou seus 'ponteiros'. Se você tem medo, há sempre uma maneira de superar isso e depois começar a desfrutar de ponteiros em C.

    
por 02.11.2011 / 17:34
fonte
0

Em princípio, você está certo de que usar ponteiros apenas quando necessário resultará em menos erros. No entanto, em C, quase o tempo todo, os ponteiros são necessários.

Por exemplo, posso estar errado, mas não acho que seu exemplo de código funcione: não acho que a função possa receber um array dinâmico como argumento, então ele terá que usar "numfields" e "fieldmax" "para calcular onde gravar os dados - que rabiscará a memória aleatória se os tamanhos errados forem passados.

E, na maioria das vezes, decidir o tamanho do retorno antecipadamente será difícil. Se você quiser evitar erros de ponteiro, use C ++ e use ponteiros apenas quando precisar.

    
por 16.01.2012 / 13:12
fonte

Tags