Ir ao conteúdo
  • Cadastre-se
CARRETA PCZAO

C como usar string em alocação dinâmica em c

Recommended Posts

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

main(){
	int i;
	char y[50];
    char *nome;
    char tam=50;
   	nome= (char*) malloc(tam*sizeof(char*));  

	for(int i=0;i<3;i++){
     printf("QUAL o seu nome: "); fflush(stdin); gets(nome);
     
    }
    
	   puts(nome);
    
       printf("\n");
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <stdlib.h>

int main(){
    char *nome;
    unsigned int tam = 50;
    
    //Em C não vai casting antes do malloc, e você quer alocar
    //caracteres (sizeof(char)), não ponteiros para caracteres
    //(sizeof(char *):
    nome = malloc(tam * sizeof(char));  
    
    
    printf("Qual o seu nome: ");
    //gets() é uma função obsoleta que foi abandonada por não
    //ser segura, logo use fgets no lugar:
    fgets(nome, tam, stdin);
    //fgets() é segura pois permite limitar o número de 
    //caracteres capturados, assim evitando que estoure o
    //tamanho da memória alocada se o usuário digitar mais
    //de tam=50 caracteres.
    
    puts(nome);
    
    return 0;
}

 

  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, tudo certo!?

Então ...

 

Como já citado é redundante explicitar o casting de ponteiro void. alguns autores o fazem apenas para preserva um clássico da linguagem.

 

image.png.febdd648a32bbd3e169fc8e96f19b3e3.png

 

Particularmente, só acho bonito!

nome= ((char *) malloc( tam ));

 

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC O arquivo na imagem que você postou tem extensão .CPP o que implica que é um arquivo C++, e será compilado usando o compilador do C++, apesar de estar usando bibliotecas do C, e no C++ seria sim necessário usar cast antes do malloc(), e por isso ocorreu a mensagem de erro. Mas por outro lado no C++ nem deveria usar malloc() e free() pois nesse caso o certo seria usar new e delete.

 

Mas está correto, antes do padrão C89/C90 da linguagem ser definido a função malloc() retornava o tipo char *, logo era necessário usar casting para outros tipos, mas a partir da versão C89/C90 malloc() passou a retornar void *, que é automaticamente promovido para qualquer outro tipo de ponteiro sem usar casting. (Todos os compiladores atuais atendem os requisitos da C89/C90.)

 

O maior problema de usar casting antes de malloc() é que em versões da linguagem anteriores a C11 o código vai compilar sem dar qualquer aviso mesmo se não incluir stdlib.h onde malloc() é declarada, por causa do casting, pois antes da C11 era assumido que uma função não declarada retorna int.

 

Outras consequências são que isto causa repetição desnecessária da informação do tipo, e aumenta a chance de erro pois existe a chance do programador usar o tipo errado no casting.

 

De fato para mim o melhor é não constar tipo em lugar algum do comando:

nome = malloc(tam * sizeof *nome);

ou

nome = malloc(tam * sizeof(*nome));

 

Assim fica bonito, simples e limpo, e nem precisa saber qual o tipo do ponteiro nome, poderia até alterar o tipo do ponteiro posteriormente sem precisar fazer qualquer alteração na chamada do malloc().

Compartilhar este post


Link para o post
Compartilhar em outros sites
24 minutos atrás, isrnick disse:

@AnsiC O arquivo na imagem que você postou tem extensão .CPP o que implica que é uma arquivo C++, e será compilado usando o compilador do C++, apesar de estar usando bibliotecas do C, e no C++ seria sim necessário usar cast antes do malloc(), e por isso ocorreu a mensagem de erro. Mas por outro lado no C++ nem deveria usar malloc() e free() pois nesse caso o certo seria usar new e delete.

 

Mas está correto que antes do padrão C89/C90 da linguagem ser definido a função malloc() retornava o tipo char *, logo era necessário usar casting para outros tipos, mas a partir da versão C89/C90 malloc() passou a retornar void *, que é automaticamente promovido para qualquer outro tipo de ponteiro sem usar casting. (Todos os compiladores atuais atendem os requisitos da C89/C90.)

 

O maior problema de usar casting antes de malloc() é que em versões da linguagem anteriores a C11 o código vai compilar sem dar qualquer aviso mesmo se não incluir stdlib.h onde malloc é definida, por causa do casting, pois antes da C11 era assumido que uma função não declarada retorna int.

 

Outras consequências são que isto causa repetição desnecessária da informação do tipo, e aumenta a chance de erro pois existe a chance do programador usar o tipo errado no casting.

 

De fato para mim o melhor é não constar tipo em lugar algum do comando:


nome = malloc(tam * sizeof *nome);

ou

nome = malloc(tam * sizeof(*nome));

 

Assim fica bonito, simples e limpo, e nem precisa saber qual o tipo do ponteiro nome, poderia até alterar o tipo do ponteiro posteriormente sem precisar fazer qualquer alteração na chamada do malloc().

Claro, usar o não usar casting é completamente irrelevante.

 

19 horas atrás, isrnick disse:

Em C não vai casting antes do malloc

Usar ou não usar casting vai de gosto também, o argumento para não usar é no mínimo engraçado.  Nunca experimentei por causa disso. Talvez seja por isso que não entendo e me vale mais aquilo que me dar satisfação.

 

Só discordo que sem casting é mais bonito, limpo e simples, nunca senti satisfação nenhuma nisso ou aumento / redução de desempenho no meu algoritmo, por optar entre uma coisa ou outra; Vai de cultura mesmo.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O primeiro parágrafo da minha resposta era sobre a imagem que você postou acima, estava comentando que ela não serve de evidência visto que até hoje no C++ seria necessário usar casting antes do malloc(), se for usar essa função no C++, o que não é o recomendado.

 

O segundo parágrafo estava confirmando sua afirmação de que em versões bem antigas da linguagem era necessário o casting quando o tipo era qualquer outro que não o tipo char *.

 

O restante é para mostrar que usar casting antes de malloc() no C é uma má ideia pois pode induzir a erros.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu entendi o seu ponto de vista, você vê lógica ou eu só vejo opção: tanto faz usar ou não. Não existem erros lógicos nem um efeito que não seja previsível até mesmo pela máquina.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concordo, se lembrar de incluir stdlib.h e usar o tipo correto no casting tecnicamente não haverá qualquer problema com o código.

 

Mas penso que não há porque criar hábitos que podem eventualmente te levar ao erro, não importa quão improvável seja que você erre, se pode eliminar completamente qualquer chance de erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 horas atrás, isrnick disse:

Mas penso que não há porque criar hábitos que podem eventualmente te levar ao erro, não importa quão improvável seja que você erre, se pode eliminar completamente qualquer chance de erro.

 

Não me atrevo a entrar nesse mérito, pois é impossível prever o nível de estupidez de quem quer que seja, entendo que algumas pessoas possam ter maiores dificuldades, mas não quero saber disso. Estou seguro com meu método porque ele me agrada bastante e não afeta a performance de minhas rotinas. A outra questão, a de não usar casting é tão pessoal quanto a de usar. Para mim as probabilidades de qualquer coisa não é a discussão, mais sim: o que se pode e o que não se pode fazer com a sintaxe do C. 

 

5 horas atrás, AnsiC disse:

Não existem erros lógicos nem um efeito que não seja previsível até mesmo pela máquina.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×